读到师兄的一篇博客,关于Java中的单件类模式,这么写的:
class Singleton { private static Singleton instance; // thread-safe singleton. public static synchronized Singleton getInstance() { if (instance == null) instance == new Singleton(); return instance; } }
以前意识过单件类直接return不是线程安全的,但还真没注意过有static synchronized这种用法……
于是搜了一下,发现了这篇文章《synchronized与static synchronized 的区别》。
结论和猜测的是一样的:
A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
B: synchronized 是某实例(对象)的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。
另外,单件类在Java中还有可以不同步的方法:
class Singleton { private static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; } }
最后给师兄博客加个反链。《Create singleton pattern in Java》
对方法加synchronized修饰符,synchronized static等同于synchronized(Singleton.class){},synchronized等同于synchronized(this){}
Effective Java书上说实现Singleton的最佳方法是这样的:
public enum Singleton {
INSTANCE;
}