我在同一个班级有三个threads
,即
Thread A obj, Thread B obj, Thread C obj
并且该类包含3个static synchronized methods
,所以当我们start
3个帖子say
a.meth1,b.meth2,c.meth3 时会发生什么 - 这三个都会执行还是只执行一个?`
更新: 面试官问我这个问题所以我确实有任何代码可以在这里写下来
答案 0 :(得分:5)
这些方法是静态的和同步的。所以,锁定将在类对象上。不在类的实例上。所以方法将一个接一个地运行.... Thread2和Thread3将不得不等到thread1完成method1()..同步化不在方法级别..它始终在对象级别... beit实例对象或类对象。
答案 1 :(得分:2)
然后他们将以串行方式逐个执行它,因为方法是静态同步的。所以锁将保持在Class Level而不是方法级别。因此,一个线程将获得锁定,而其他线程则必须等待。
你应该尝试运行它并查看。
答案 2 :(得分:1)
一旦调用同步方法,VM将自动请求授予您调用该方法的对象的访问权限。如果给出,它将进入synchronized方法。退出时,会释放此访问权限。在保留权限的同时,不允许任何其他人进入同一对象的任何同步方法,从而有效地序列化请求。
这有意义吗?
同步旨在使线程安全并避免竞争条件,这种方式减少了对最多一个线程的访问。程序无法确定两个同步方法A
和B
是否已连接,因此它具有最小容差的策略。
如果您有更多必要的同步,例如A
和B
需要相互排斥,C
和D
需要相互排斥,但不能介于A
和{{1}之间然后建议通常是将代码模块化,以便C
进入一个对象,而A+B
进入另一个对象,从而避免跨过彼此的脚趾
答案 3 :(得分:1)
如果对同一类对象的执行尝试从不同的线程输入相同的同步方法(无论是否为静态),它们将被同步(即一次执行一个)。
答案 4 :(得分:0)
static synchronized methods
和non static synchronized methods
之间的主要区别在于non-static synchronized methods
锁定了类的instance
而static synchronized methods
锁定了class
对象。
由于在java中每个类都有一个类对象,因此在同一个类中只能在静态同步方法中执行一个线程。
对于非静态同步方法,只有一个线程可以在同一对象中的静态同步方法内执行
还有一点是同步在对象级别而不是方法级别。