Java 同步静态方法

Java 同步静态方法,java,parallel-processing,synchronized,Java,Parallel Processing,Synchronized,如果我有一个包含多个同步方法的类,其中一些是静态的,一些不是: public class A { public static void synchronized f1() {} public void synchronized f2() {} } 当一个线程调用f1()而第二个线程调用f2()时会发生什么,这意味着它们是如何相互同步的。如果一个踏板调用f1(),f1()调用f2(),会发生什么 同步静态方法在类对象上同步,而不是在实例上同步 f1()和f2()可以由两个单独

如果我有一个包含多个同步方法的类,其中一些是静态的,一些不是:

public class A {
    public static void synchronized f1() {}
    public void synchronized f2() {}
}  

当一个线程调用f1()而第二个线程调用f2()时会发生什么,这意味着它们是如何相互同步的。如果一个踏板调用f1(),f1()调用f2(),会发生什么

同步静态方法在类对象上同步,而不是在实例上同步

f1()
f2()
可以由两个单独的线程调用,并将同时执行

请参阅:

它们根本不同步。静态方法在
A.class
上同步,第二个方法在
this
上同步。所以(几乎)就好像你写了:

public class A {
    public static void f1() {
        synchronized(A.class) {
            ...
        }
    }

    public void f2() {
        synchronized(this) {
            ...
        }
    }
}
如果一个踏板调用f1()和f1()调用f2()会发生什么

然后,该线程将在
f2期间拥有两个监视器。在执行此操作之前,您应该小心,因为如果在其他位置按相反顺序取出锁,则会出现死锁


就我个人而言,我建议您完全避免使用同步方法。相反,在仅用于锁定的私有最终字段上进行同步。这意味着只有您的类才能获取相关的监视器,因此您可以更仔细地推断锁被持有时发生的情况,并避免死锁等。

同步静态方法在类的相应类对象上同步,因此它与实例方法使用的锁不同。显然,静态方法无法访问此
。因此,f1()和f2()方法不是相互同步的,只是针对该类的其他静态或其他实例方法。

可能不久就会出现死锁。如果我有两个线程:T1、T2。T2调用f2(){…f1();…},T1调用f1{…notifyAll();wait();…}。如果T1调用wait(),f1()中的notifyAll(),由T2调用将唤醒T1?@Michael:仅仅从注释中理解代码是非常困难的,问题也不清楚。如果你有一个特定的问题,我建议你把它编辑到你原来的帖子中(或者开始一个新的帖子)。