同步:为什么首选锁定私人最后静态对象,而不是类的类对象?

问题描述:

简单问题:同步:为什么首选锁定私人最后静态对象,而不是类的类对象?

为什么会变成这样是首选:

public class Foo { 

    final private static Object foo = new Object(); 

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

在这个:

public class Foo { 

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

或本:

public class Foo { 

    public synchronized static void doSomething() { 
     //code 
    } 
} 

对我来说,这些看上去都基本上是相同的,所以我不知道什么是同步访问静态字段的最好办法,或者为什么人会比另一种好,但我第一次听到的往往是首选。

这是关于封装。如果您锁定在专用字段上,则其他代码无法锁定在同一个对象上。如果你锁定类对象或实例上,在访问你的类也可以对同一个对象的锁的情况下,引入意想不到的同步问题等引起的锁定顺序违规的死锁系统任何其他代码。