單例模式學習—懶漢模式
在學習了多執行緒課程中關於單例模式部分後記錄一些知識點。
常見的單例模式一:懶漢模式。
public class Singleton { private Singleton() { //初始化 } private static Singleton instance = null; public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } returninstance; } }
分析:在單執行緒中能保證建立唯一的例項。但是在多執行緒的情況下可能會出現錯誤。
錯誤原因:當A執行緒訪問到1(if判斷)時,CPU被執行緒B所佔據此時instance還未初始化依舊為null。所以B執行緒建立了一個instance然後A也建立了一個instance。
測試程式碼:
public class ThreadA extends Thread { public void run(){ System.out.println(Singleton.getInstance().hashCode()); } public static voidmain(String[] args) { ThreadA t1 = new ThreadA(); ThreadA t2 = new ThreadA(); ThreadA t3 = new ThreadA(); t1.start(); t2.start(); t3.start(); } }
結果:1217036164、2140075580、2140075580
hashcode不相同證明不是同一個物件=》不是單例=》執行緒不安全