設計模式6 單例模式與多執行緒初始化

2022-09-23 10:07:00 字數 1788 閱讀 6860

package designpattern;

public class singletonpattern //禁用例項化物件,不允許建立多個例項物件

private static traditionsingleton uniqueinstance;

public static traditionsingleton getinstance()

return uniqueinstance;}}

//多執行緒單例模式

//1.新增同步,但是會降低效率(延遲初始化

public static class singleton1

private static singleton1 uniqueinstance;

public synchronized static singleton1 getinstance()

return uniqueinstance;}}

//2.雙重檢查鎖定(常見錯誤)(延遲初始化

public static class singleton2

private static singleton2 uniqueinstance;

public static singleton2 getinstance()

}return uniqueinstance;}}

/*雙重檢查鎖定的問題:

uniqueinstance=new singleton2();

可以分解為:

memory = allocate(); //1分配記憶體空間

ctorinstance(memory); //2初始化物件

instance=memory; //3設定instance指向剛初始化的物件

由於指令重派的問題,編譯器或者系統可能將賦值語句排到初始化語句前,如果,另外一個執行緒在賦值語句後,

初始化語句前訪問了該引用,此時會出現nullpoint問題

*///3.類初始化鎖,把同步交給jvm

//(1)急切初始化

public static class singleton31

private static singleton31 uniqueinstance= new singleton31();

public static singleton31 getinstance()

}//(2)延遲初始化

public static class singleton32

private static class instanceholder

public static singleton32 getinstance()}/*

原理:允許初始化中23的重排序,但是不允許非構造執行緒看到這個重排序,利用jvm對類的初始化過程的同步

首先從jvm中獲取instanceholder初始化鎖的執行緒,負責初始化過程,其他執行緒看不見這個初始化過程

缺點:只能對靜態欄位延遲初始化

*///4.使用volatile(延遲初始化

public static class singleton4

private volatile static singleton4 uniqueinstance;

public static singleton4 getinstance()

}return uniqueinstance;}}

/*volatile語義 重寫uniqueinstance內容前的所有讀寫操作(包括volatile讀寫和普通讀寫)不能重排序,

因此禁止了初始化語句和賦值語句的重排序

*/}

lazy初始化和執行緒安全的單例模式

jdk 版本 jdk1 5 起 是否 lazy 初始化 是 是否多執行緒安全 是 實現難度 較複雜 描述 這種方式採用雙鎖機制,安全且在多執...

雙重檢查鎖定的單例模式和延遲初始化

有時候需要推遲一些高開銷的物件初始化操作,並且只有在使用這些物件時才進行初始化。此時,常用的可能就是延遲初始化,例如 懶漢式單例模式,但是要...