1. 程式人生 > >java叢集優化——多執行緒下的單例模式

java叢集優化——多執行緒下的單例模式

        在最初學習設計模式時,我為絕佳的設計思想激動不已,在以後的工程中,多次融合設計模式,而在當下的設計中,我們已經覺察出了當初設計模式的高瞻遠矚,但是也有一些不足,需要我們去改進,有人說過,世界上沒有絕對的事,當然,再簡單的事情,環境變了,也會發生變化,今天和大家一起分享在多執行緒下單例模式的優化。

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;
    }
 }


    這種優化,使我們更優雅地適用程式碼,但是也帶來了一定的問題,就是我們對物件的型別有了模糊的概念,所以在工作中,還是建議保留雙鎖模式,對一些工具類則可以採取列舉型別優化,簡化我們的程式碼與邏輯。

總結:

        細節的優化,就像雕琢一件藝術品,我們接觸的高人越多,這樣的思想就越濃厚,所以,我們常常判斷一個人事怎麼的品格與素質,通過他接觸的人,朋友就可以推測出來,而計算機內,也是如此,我們接觸的優秀框架多了,自己自然就是優秀的設計師!