Java - 同步静态方法
2022-09-04 23:47:08
这是我在此链接中找到的一段文字。
“避免锁定静态方法
最糟糕的解决方案是将“synchronized”关键字放在静态方法上,这意味着它将锁定此类的所有实例。
为什么同步静态方法会锁定类的所有实例?难道不应该锁定类吗?
这是我在此链接中找到的一段文字。
“避免锁定静态方法
最糟糕的解决方案是将“synchronized”关键字放在静态方法上,这意味着它将锁定此类的所有实例。
为什么同步静态方法会锁定类的所有实例?难道不应该锁定类吗?
要了解这一点,最简单的方法是比较锁的工作原理与实例方法和静态方法。假设您有类 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根本无法访问静态方法
实际上,类的静态方法上的锁与放置锁(这是唯一的实例)相同:Foo
Foo.class
public static void doSomething()
{
synchronized(Foo.class)
{
// ...
}
}