2014-02-19 33 views
1

我在同一类即 Thread A obj, Thread B obj, Thread C obj有三个threads和类包含3 static synchronized methods所以当我们start 3个线程say a.meth1,b.meth2,c.meth3 什么会发生 - 做所有三会执行或只有一个`的java:正在运行的线程方法在同一类

更新: interviewr问我这个问题所以实际上我确实有任何代码来在这里写

+2

如果您发布了一些相关的代码,问题会变得更加清晰。 –

+0

@ExtremeCoders我的面试官口头问我这个问题。 –

回答

5

这些方法是静态的和同步的。所以,锁将在类对象上。不在类的实例上..所以这些方法会一个接一个地运行.... Thread2和Thread3将会有等待,直到thread1完成method1().. syncronization不是在方法级别..它总是在对象级... beit实例对象或类对象。

+1

为什么这么多'..'? –

+1

谢谢你,我还说要采访这个相同的东西 –

+2

@SotiriosDelimanolis - 一个坏习惯......哪个BTW我打算结束...... :) – TheLostMind

2

那么他们将通过一个串行执行它吗?因为这些方法是静态同步的。所以锁定将保持在Class Level而不是方法级别。因此,一个线程将获得锁定,而其他线程将不得不等待。

你应该尝试运行这个并看看。

+1

这些方法是静态的和同步的。 –

+0

它们是静态的和同步的。所以,锁将在类对象上。不在类的实例上..所以这些方法会一个接一个地运行...... Thread2和Thread3必须等到thread1完成method1().. syncronization不在方法级别..它始终在对象级别... beit实例对象或类对象... – TheLostMind

+0

@SotiriosDelimanolis我监督'静态'..我的错误。更新了答案。谢谢指出。 – Sanjeev

1

一旦您调用同步方法,虚拟机将自动为您调用方法的对象请求一个访问授权。如果这是给定的,它将进入同步方法。退出直到将释放此访问权限。在保留权限的同时,不允许任何人进入同一对象的任何同步方法,从而有效地序列化请求。

确实有道理吗?

同步的目的是让事情变得线程安全并避免竞争条件,并且这种方式最多可以减少对最多一个线程的访问。程序无法确定两个同步方法AB是否以其他方式连接,因此它具有最小容差的策略。

如果您需要更多的同步,例如该AB需求是相互排斥的,CD需求是相互排斥的,但不是之间,说AC然后建议通常对modularise代码,以便A+B进入一个对象,而C+D进入另一个,从而避免以跨越彼此的脚趾

+0

对不起,没有看到对静态方法的引用,也跟其他人都说的类一样 –

1

如果执行同一类的对象试图从不同线程进入同一同步方法(不管是否为静态),它们将被同步(即一次执行一个)。

0

static synchronized methodsnon static synchronized methods之间的主要区别是,non-static synchronized methods保持在类而static synchronized methodsclass对象上的instance的锁。

由于在java中每个类都有一个类对象,所以在同一个中只有一个线程可以在静态同步方法内部执行。

对于非静态同步方法只有一个线程可以在同一对象

还有一点静态同步方法内执行是同步是在对象级别不是作为方法的水平。

相关问题