Java 如何安全的發(fā)布對(duì)象
安全發(fā)布對(duì)象
- 在靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象引用
- 將對(duì)象的引用保存到volatile類(lèi)型域或者AtomicReference對(duì)象中
- 將對(duì)象的引用保存到某個(gè)正確構(gòu)造對(duì)象的final類(lèi)型域中
- 將對(duì)象的引用保存到一個(gè)由鎖保護(hù)的域中
Spring 框架中,Spring管理的類(lèi)都是單例模式。如何保證一個(gè)實(shí)例只被初始化一次,且線程安全?通過(guò)不同單例的寫(xiě)法,具體描述安全發(fā)布對(duì)象的四種方法:
在靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象的引用(不推薦)
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):用不用都會(huì)初始化對(duì)象,如果初始化工作較多,加載速度會(huì)變慢,影響系統(tǒng)性能。
將對(duì)象的引用保存到volatile類(lèi)型或AtomicReference對(duì)象中(推薦)
package com.rumenz.task.single; //線程安全 //懶漢模式 public class SingletonExample1 { private SingletonExample1() { //初始化操作 } // 1、memory = allocate() 分配對(duì)象的內(nèi)存空間 // 2、ctorInstance() 初始化對(duì)象 // 3、instance = memory 設(shè)置instance指向剛分配的內(nèi)存 // 單例對(duì)象 volatile + 雙重檢測(cè)機(jī)制 -> 禁止指令重排 private volatile static SingletonExample1 singletonExample1=null; //靜態(tài)工廠方法 public static SingletonExample1 getInstance(){ if(singletonExample1==null){ //雙重檢測(cè) synchronized(SingletonExample1.class){ //同步鎖 if(singletonExample1==null){ singletonExample1=new SingletonExample1(); } } } return singletonExample1; } }
優(yōu)點(diǎn):按需加載
缺點(diǎn):第一次初始化的時(shí)候可能會(huì)比較慢
通過(guò)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都會(huì)加鎖,耗費(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ā)布對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于Java 安全的發(fā)布對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的示例代碼
Layuimini是Layui的升級(jí)版,它是專(zhuān)業(yè)做后臺(tái)頁(yè)面的框架,而且是適合PC端和移動(dòng)端,以下地址可以在PC端顯示,也可以在手機(jī)上顯示,只不過(guò)會(huì)做自適應(yīng),本文將給大家介紹了SpringBoot+layuimini實(shí)現(xiàn)左側(cè)菜單動(dòng)態(tài)展示的方法,需要的朋友可以參考下2024-04-04Java一些常見(jiàn)的出錯(cuò)異常處理方法總結(jié)
下面小編就為大家?guī)?lái)一篇Java一些常見(jiàn)的出錯(cuò)異常處理方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06Spring中容器的創(chuàng)建流程詳細(xì)解讀
這篇文章主要介紹了Spring中容器的創(chuàng)建流程詳細(xì)解讀,Spring?框架其本質(zhì)是作為一個(gè)容器,提供給應(yīng)用程序需要的對(duì)象,了解容器的誕生過(guò)程,有助于我們理解?Spring?框架,也便于我們“插手”這個(gè)過(guò)程,需要的朋友可以參考下2023-10-10JDBC實(shí)現(xiàn)Mysql自動(dòng)重連機(jī)制的方法詳解
最近在工作中發(fā)現(xiàn)了一個(gè)問(wèn)題,通過(guò)查找相關(guān)的資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于JDBC實(shí)現(xiàn)Mysql自動(dòng)重連機(jī)制的相關(guān)資料,文中給出多種解決的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07springboot如何解決跨域后session獲取不到sessionId不一致
這篇文章主要介紹了springboot如何解決跨域后session獲取不到sessionId不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01SpringBoot+OCR?實(shí)現(xiàn)圖片文字識(shí)別
本文主要介紹了SpringBoot+OCR 實(shí)現(xiàn)圖片文字識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Java集合中的fail-fast(快速失敗)機(jī)制詳解
這篇文章主要給大家介紹了關(guān)于Java集合中fail-fast(快速失敗)機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02