java:在同一个类中运行线程方法

时间:2014-02-19 06:15:07

标签: java multithreading

我在同一个班级有三个threads,即 Thread A obj, Thread B obj, Thread C obj并且该类包含3个static synchronized methods,所以当我们start 3个帖子say a.meth1,b.meth2,c.meth3 时会发生什么 - 这三个都会执行还是只执行一个?`

更新: 面试官问我这个问题所以我确实有任何代码可以在这里写下来

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

然后他们将以串行方式逐个执行它,因为方法是静态同步的。所以锁将保持在Class Level而不是方法级别。因此,一个线程将获得锁定,而其他线程则必须等待。

你应该尝试运行它并查看。

答案 2 :(得分:1)

一旦调用同步方法,VM将自动请求授予您调用该方法的对象的访问权限。如果给出,它将进入synchronized方法。退出时,会释放此访问权限。在保留权限的同时,不允许任何其他人进入同一对象的任何同步方法,从而有效地序列化请求。

这有意义吗?

同步旨在使线程安全并避免竞争条件,这种方式减少了对最多一个线程的访问。程序无法确定两个同步方法AB是否已连接,因此它具有最小容差的策略。

如果您有更多必要的同步,例如AB需要相互排斥,CD需要相互排斥,但不能介于A和{{1}之间然后建议通常是将代码模块化,以便C进入一个对象,而A+B进入另一个对象,从而避免跨过彼此的脚趾

答案 3 :(得分:1)

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

答案 4 :(得分:0)

static synchronized methodsnon static synchronized methods之间的主要区别在于non-static synchronized methods锁定了类的instancestatic synchronized methods锁定了class对象。

由于在java中每个类都有一个类对象,因此在同一个中只能在静态同步方法中执行一个线程。

对于非静态同步方法,只有一个线程可以在同一对象中的静态同步方法内执行

还有一点是同步在对象级别而不是方法级别。