日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java单例模式】Java单例模式之懒汉模式线程安全

發(fā)布時間:2023/12/18 java 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java单例模式】Java单例模式之懒汉模式线程安全 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

單例模式是設計模式中用得比較多的一種設計模式,它的主要優(yōu)點有:

1.訪問受控,保證訪問的是唯一的實例。

2.由于只有一個實例,所以節(jié)省資源。?

缺點:

靈活性低,如果對象的應用場景多變,則不適用單例模式。

?

1.如何實現(xiàn)單例模式?

1.1 懶漢模式(線程不安全)

想要實現(xiàn)單例,莫非就是要適用static關鍵字,如下聲明一個對象:

public class SingleTon {private static SingleTon singleTon = null;}

這樣我們就得到了一個類型為SingleTon的靜態(tài)變量,接下來,我們就要控制這個類,不能被任意的new出來,這個就是實現(xiàn)了單例模式唯一性的根本,代碼如下:

public class SingleTon {private static SingleTon singleTon = null;
//把構造函數(shù)設置為private,防止被new實例化
private SingleTon() {}public static SingleTon getInstance() {//每次調(diào)用SingleTon.getInstance()時返回的都是singleTon唯一對象if( singleTon == null ) {singleTon = new SingleTon();}return singleTon;}

?

這種模式的單例在非并發(fā)環(huán)境下是可靠的,我們知道,我們保證類是單例的代碼關鍵是

if(singleTon == null)

并且java中new是不具有原子性的(涉及到賦值問題),所以,在并發(fā)環(huán)境下,是可能執(zhí)行了多次的new操作,造成實例非唯一性。

?

1.2如何解決?

為了解決問題,首先就要明白問題產(chǎn)生的原因:

上述懶漢產(chǎn)生多個實例造成單例失效的原因是在高并發(fā)環(huán)境下可能同時有2個或以上的線程訪問getInstance()類方法,又因為new操作不具有原子性,所以會導致產(chǎn)生2個實例的問題。

?

因此,我們可以:

1.通過添加synchronized來修飾getInstance()方法,簡單有效粗暴,但是往往暴力使用同步方法帶來的問題都是一樣的,就是慘重的效率代價~

2.通過添加synchronized來同步部分代碼塊,并且通過volatile來防止指令重排,代碼如下:

public class SingleTon {private static SingleTon singleTon = null;private SingleTon() {}public static SingleTon getInstance() {if( singleTon == null ) {synchronized( SingleTon.class ) {if( singleTon == null ) {singleTon = new SingleTon();}}}return singleTon;}}

上述方法就是傳說中的DCL雙重檢查鎖定單例(JDK1.5之后的版本)

?

轉(zhuǎn)載于:https://www.cnblogs.com/dick159/p/6601086.html

總結(jié)

以上是生活随笔為你收集整理的【Java单例模式】Java单例模式之懒汉模式线程安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。