同步静态方法

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()会发生什么?

Jon*_*eet 9

他们根本没有彼此同步.静态方法同步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.在你这样做之前你应该小心,就好像你在其他地方以相反的顺序取出锁,你将陷入僵局.

我个人会敦促你完全避免同步方法.而是在用于锁定的私有,最终字段上进行同步.这意味着只有您的类能够获取相关的监视器,因此您可以更加仔细地了解锁定时发生的情况,并避免死锁等.