您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么在Java中安全的發(fā)布一個(gè)對(duì)象,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在靜態(tài)初始化函數(shù)中初始化一個(gè)對(duì)象引用
將對(duì)象的引用保存到volatile類型域或者AtomicReference對(duì)象中
將對(duì)象的引用保存到某個(gè)正確構(gòu)造對(duì)象的final類型域中
將對(duì)象的引用保存到一個(gè)由鎖保護(hù)的域中
Spring 框架中,Spring管理的類都是單例模式。如何保證一個(gè)實(shí)例只被初始化一次,且線程安全?通過不同單例的寫法,具體描述安全發(fā)布對(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)性能。
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ì)比較慢
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; } } }
上述就是小編為大家分享的怎么在Java中安全的發(fā)布一個(gè)對(duì)象了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。