Java - 同步静态方法

2022-09-04 23:47:08

这是我在此链接中找到的一段文字。

“避免锁定静态方法

最糟糕的解决方案是将“synchronized”关键字放在静态方法上,这意味着它将锁定此类的所有实例。

为什么同步静态方法会锁定类的所有实例?难道不应该锁定类吗?


答案 1

要了解这一点,最简单的方法是比较锁的工作原理与实例方法和静态方法。假设您有类 Test.java,它有两种方法,如下所示。

public class Test{
   public synchronized void instanceMethod(){
   }

   public synchronized static void staticMethod(){
   } 
}

同时,有两个类 Test 的实例,testA 和 testB。还有两个线程 tA 和 tB 尝试并行访问类 Test。

锁定实例方法:当 tA 在 testA实例方法上获得锁定时,tB 在 testA 中无法访问相同的方法,但是 tB 仍然可以自由地在 testB 中调用实例方法。因为针对实例的同步方法是实例级锁定

在 staticMethod 上锁定:但是,当 tA 在 staticMethod 上获得锁定时,该锁与 testA 或 testB 无关,因为静态方法上的同步是类级锁定。这意味着在tA释放锁之前,tB根本无法访问静态方法


答案 2

实际上,类的静态方法上的锁与放置锁(这是唯一的实例)相同:FooFoo.class

public static void doSomething()
{
    synchronized(Foo.class)
    {
        // ...
    }
}

推荐