java叢集優化——多執行緒下的單例模式
阿新 • • 發佈:2018-12-26
在最初學習設計模式時,我為絕佳的設計思想激動不已,在以後的工程中,多次融合設計模式,而在當下的設計中,我們已經覺察出了當初設計模式的高瞻遠矚,但是也有一些不足,需要我們去改進,有人說過,世界上沒有絕對的事,當然,再簡單的事情,環境變了,也會發生變化,今天和大家一起分享在多執行緒下單例模式的優化。
1,傳統
首先,我們回顧下傳統的單例(懶漢式)是如何工作的:
public class SingletonClass{ private static SingletonClass instance=null; public static SingletonClass getInstance() { if(instance==null) { instance=new SingletonClass(); } return instance; } private SingletonClass(){ } }
我們不難看出,在多執行緒執行時,普通的程式碼會帶了困惱,大家看多執行緒程式碼執行時的圖片:
2,雙重鎖
我們看到執行緒1和執行緒2都執行了程式碼②,我們得到的並不是一個單例的物件,而是多個物件。針對這些我們進行了同步的優化。
public static class Singleton{ private static Singleton instance=null; private Singleton(){ //do something } public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(null==instance){ instance=new Singleton(); } } } return instance; } }
我們在看看這種程式碼的多執行緒執行圖:
大家看,③只執行了一次,不僅僅是它被同步機制保護了,而且是進行了雙重判定,這樣保證多執行緒下單例模式的正常執行。
3,列舉
在jdk1.5之後,java注意到這一細節,在建立單例應用時,我們可以利用列舉型別完成我們的工作,並且他是執行緒安全的。
原始碼:
public enum SingletonEnum { INSTANCE; private String name; publicString getName() { returnname; } publicvoid setName(String name) { this.name = name; } }
這種優化,使我們更優雅地適用程式碼,但是也帶來了一定的問題,就是我們對物件的型別有了模糊的概念,所以在工作中,還是建議保留雙鎖模式,對一些工具類則可以採取列舉型別優化,簡化我們的程式碼與邏輯。
總結:
細節的優化,就像雕琢一件藝術品,我們接觸的高人越多,這樣的思想就越濃厚,所以,我們常常判斷一個人事怎麼的品格與素質,通過他接觸的人,朋友就可以推測出來,而計算機內,也是如此,我們接觸的優秀框架多了,自己自然就是優秀的設計師!