Java 如何安全的發(fā)布對(duì)象
Spring 框架中,Spring管理的類都是單例模式。如何保證一個(gè)實(shí)例只被初始化一次,且線程安全?通過(guò)不同單例的寫法,具體描述安全發(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類型或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)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. PHP基礎(chǔ)之生成器4——比較生成器和迭代器對(duì)象2. Django項(xiàng)目如何正確配置日志(logging)3. 詳解PHP laravel中的加密與解密函數(shù)4. ASP新手必備的基礎(chǔ)知識(shí)5. 利用Java對(duì)PDF文件進(jìn)行電子簽章的實(shí)戰(zhàn)過(guò)程6. PHP輸入流php://input的使用分析7. CentOS郵箱服務(wù)器搭建系列——SMTP服務(wù)器的構(gòu)建( Postfix )8. asp文件用什么軟件編輯9. Docker 啟動(dòng)Redis 并設(shè)置密碼的操作10. PHP與MYSQL數(shù)據(jù)庫(kù)連接

網(wǎng)公網(wǎng)安備