餓漢式
沒有線程安全性問題
懶漢式
public class SingletonDemo2 {private static SingletonDemo2 instance;private SingletonDemo2() {}public static SingletonDemo2 getInstance() {if(instance==null) {instance=new SingletonDemo2();}return instance;}}
如果遇到多線程。上面的代碼會返回不同的?SingletonDemo2 實例。違背了單例設計。
需要加上?synchronized 關鍵字。如下:
public synchronized static SingletonDemo2 getInstance() {if(instance==null) {instance=new SingletonDemo2();}return instance;}
雖然解決了 “
返回不同的?
SingletonDemo2 實例”問題,但是在線程很多得時候,性能不好,因為
synchronized 放在靜態方法上,內置鎖就是當前類的Class字節碼對象,當一些偏向鎖,輕量級鎖過來的時候,都會失去它們性能優勢,變成像 重量級鎖一樣。因而還不是最好的方法,需要改進。
最終版本:
public class Singleton2 {private Singleton2() {}//volatile 防止jvm 指令重排序private static volatile Singleton2 instance;public static Singleton2 getInstance(){if(instance==null) {synchronized (Singleton2.class) {if(instance==null) {instance=new Singleton2();}}}return instance;}
}