【Java单例模式】Java单例模式之懒汉模式线程安全
單例模式是設計模式中用得比較多的一種設計模式,它的主要優(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Grid Layout] Place
- 下一篇: java美元兑换,(Java实现) 美元