Java 如何安全的發(fā)布對象
Spring 框架中,Spring管理的類都是單例模式。如何保證一個實(shí)例只被初始化一次,且線程安全?通過不同單例的寫法,具體描述安全發(fā)布對象的四種方法:
在靜態(tài)初始化函數(shù)中初始化一個對象的引用(不推薦)package com.rumenz.task.single;//線程安全//餓漢模式//靜態(tài)代碼塊初始化public class SingletonExample { private SingletonExample(){ //初始化操作 } private static SingletonExample singletonExample=null; static { singletonExample=new SingletonExample(); } public static SingletonExample getInstance(){ return singletonExample; }}//或者package com.rumenz.task.single;//線程安全//餓漢模式//靜態(tài)代碼塊初始化public class SingletonExample { private SingletonExample(){ //初始化操作 } private static SingletonExample singletonExample=new SingletonExample(); public static SingletonExample getInstance(){ return singletonExample; }}
缺點(diǎn):用不用都會初始化對象,如果初始化工作較多,加載速度會變慢,影響系統(tǒng)性能。
將對象的引用保存到volatile類型或AtomicReference對象中(推薦)package com.rumenz.task.single;//線程安全//懶漢模式public class SingletonExample1 { private SingletonExample1() { //初始化操作 } // 1、memory = allocate() 分配對象的內(nèi)存空間 // 2、ctorInstance() 初始化對象 // 3、instance = memory 設(shè)置instance指向剛分配的內(nèi)存 // 單例對象 volatile + 雙重檢測機(jī)制 -> 禁止指令重排 private volatile static SingletonExample1 singletonExample1=null; //靜態(tài)工廠方法 public static SingletonExample1 getInstance(){ if(singletonExample1==null){ //雙重檢測 synchronized(SingletonExample1.class){ //同步鎖if(singletonExample1==null){ singletonExample1=new SingletonExample1();} } } return singletonExample1; }}
優(yōu)點(diǎn):按需加載缺點(diǎn):第一次初始化的時候可能會比較慢
通過synchronized(不推薦)package com.rumenz.task.single;public class SingletonExample3 { //私有構(gòu)造函數(shù) private SingletonExample3(){ //初始化操作 } private static SingletonExample3 singletonExample3=null; //靜態(tài)的工廠方法 public static synchronized SingletonExample3 getSingletonExample3(){ if(singletonExample3==null){ singletonExample3=new SingletonExample3(); } return singletonExample3; }}
缺點(diǎn):每次進(jìn)入getSingletonExample3都會加鎖,耗費(fèi)資源,故不推薦使用。
枚舉(推薦)package com.rumenz.task.single;public class SingletonExample4 { //私有構(gòu)造函數(shù) private SingletonExample4(){ //初始化 } public static SingletonExample4 getSingletonExample4(){ return Singleton.INSTANCE.getSingleton(); } private enum Singleton{ INSTANCE; private SingletonExample4 singleton; Singleton(){ singleton=new SingletonExample4(); } public SingletonExample4 getSingleton(){ return singleton; } }}
優(yōu)點(diǎn):天然線程安全,可防止反射生成實(shí)例,推薦使用
以上就是Java 如何安全的發(fā)布對象的詳細(xì)內(nèi)容,更多關(guān)于Java 安全的發(fā)布對象的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 詳解瀏覽器的緩存機(jī)制2. jsp+servlet簡單實(shí)現(xiàn)上傳文件功能(保存目錄改進(jìn))3. asp批量添加修改刪除操作示例代碼4. jsp EL表達(dá)式詳解5. HTML5 Canvas繪制圖形從入門到精通6. css代碼優(yōu)化的12個技巧7. .NET SkiaSharp 生成二維碼驗(yàn)證碼及指定區(qū)域截取方法實(shí)現(xiàn)8. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法9. jsp實(shí)現(xiàn)登錄驗(yàn)證的過濾器10. 爬取今日頭條Ajax請求
