Mic*_*ael 4 java parallel-processing synchronized
如果我有一个包含许多同步方法的类,其中一些是静态的,而其中一些不是:
public class A {
public static void synchronized f1() {}
public void synchronized f2() {}
}
Run Code Online (Sandbox Code Playgroud)
当一个线程调用f1()和第二个调用f2()时会发生什么,这意味着它们如何彼此同步.如果一个胎面调用f1()和f1()调用f2()会发生什么?
他们根本没有彼此同步.静态方法同步A.class,第二个同步this.所以它(几乎)好像你写的:
public class A {
public static void f1() {
synchronized(A.class) {
...
}
}
public void f2() {
synchronized(this) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果一个胎面调用f1()和f1()调用f2()会发生什么
然后该线程将拥有两个监视器f2.在你这样做之前你应该小心,就好像你在其他地方以相反的顺序取出锁,你将陷入僵局.
我个人会敦促你完全避免同步方法.而是在仅用于锁定的私有,最终字段上进行同步.这意味着只有您的类能够获取相关的监视器,因此您可以更加仔细地了解锁定时发生的情况,并避免死锁等.