静态同步方法与非静态同步方法的区别

3
我有一个类
class Foo{

    static synchronized get(){}
    synchronized() getMore(){}
}

我有两个对象Foo.get()f.getMore()在两个不同的线程t1和t2中运行。我怀疑当线程t1获取类的锁时,线程t2是否可以访问方法getMore,或者由于类对象被t1锁定而阻止t2获得对该方法的访问和锁定。


可能是Java中的并发:同步静态方法的重复问题。 - bmargulies
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3

静态同步 ---> 类级别锁定(类级别范围)

这与以下情况类似:

synchronized(SomeClass.class){
 //some code
}

简单同步 ---> 实例级别锁定

例子:

class Foo{

     public static synchronized void bar(){
         //Only one thread would be able to call this at a time  
     }

     public synchronized void bazz(){
         //One thread at a time ----- If same instance of Foo
         //Multiple threads at a time ---- If different instances of Foo class
     }

}

3
静态方法将会锁定在Class对象上,而不是实例对象上。你有两个锁分别作用于两个不同的对象。在你上面的场景中,不会有阻塞行为发生。

1

synchronized 锁定一个对象,而 static synchronized 则锁定代表类的对象。

t1 和 t2 可以同时调用这些方法,除非它们都在 static synchronized 方法中,除非只有一个线程在 wait() 状态。

注意:t1 和 t2 可以同时调用不同对象的 getMore() 方法。


1

synchonized static method 会获取与 Foo 类相关联的 java.lang.Class 对象的锁。

synchonized instance method 会获取实际对象的锁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,