建立執行緒安全的單例模式

2021-09-14 04:08:32 字數 2647 閱讀 1311

1、餓漢模式–類載入就例項化–執行緒安全

package singleinstance;

/** * 餓漢式單例模式:例項化類就載入例項-天生執行緒安全

*/public class singleinstance

//建立例項

private static singleinstance instance = new singleinstance();

//提供例項獲得方法

public static singleinstance getinstance()

}

2、懶漢式單例–需要的時候在例項化–非執行緒安全

package singleinstance;

/**呼叫get方法的時候判斷例項物件是否為空,為空在例項化,有執行緒安全問題。

*/public class singleinstance_lazy

private static singleinstance_lazy singleinstance_lazy = null;

public static singleinstance_lazy getsingleinstance_lazy() catch (interruptedexception e)

singleinstance_lazy = new singleinstance_lazy();

}return singleinstance_lazy;

}}

呼叫方法:

public static void lazysingletest()

}).start();}}

輸出:singleinstance.singleinstance_lazy@11f3ef5e

singleinstance.singleinstance_lazy@731f7d35

singleinstance.singleinstance_lazy@1fe9b76c

singleinstance.singleinstance_lazy@11f3ef5e

singleinstance.singleinstance_lazy@7c2aa267

加上synchronized 關鍵字

public class singleinstance_lazy 

private static singleinstance_lazy singleinstance_lazy = null;

public static synchronized singleinstance_lazy getsingleinstance_lazy() catch (interruptedexception e)

singleinstance_lazy = new singleinstance_lazy();

}return singleinstance_lazy;

}}

但是會有效率問題,執行緒會一直自旋等待。鎖的粒度太大,我們考慮減少鎖的**塊

public class singleinstance_lazy 

private static singleinstance_lazy singleinstance_lazy = null;

public static singleinstance_lazy getsingleinstance_lazy() catch (interruptedexception e)

synchronized (singleinstance_lazy.class)

}return singleinstance_lazy;

}}

但是又會出現執行緒安全性問題,假如兩個執行緒同時判斷為null

輸出:

singleinstance.singleinstance_lazy@7c2aa267

singleinstance.singleinstance_lazy@11f3ef5e

singleinstance.singleinstance_lazy@731f7d35

singleinstance.singleinstance_lazy@24e0614d

singleinstance.singleinstance_lazy@1fe9b76c

也沒有實現單例的效果

所以考慮優化成雙重判斷:

public class singleinstance_lazy 

private static singleinstance_lazy singleinstance_lazy = null;

public static singleinstance_lazy getsingleinstance_lazy() catch (interruptedexception e)

synchronized (singleinstance_lazy.class)

}return singleinstance_lazy;

}}

所以加上關鍵字volatile,保證不讓編譯器不優化順序

private static volatile singleinstance_lazy singleinstance_lazy;

建立執行緒安全的單例模式

單例模式的概念 單例模式就是確保只有乙個例項,而且自行例項化並向整個系統傳遞這個例項,這個類就稱作單例類 單例模式最重要的乙個特點就是構造方法私有化,單例模式分為懶漢式和餓漢式 第一種 懶漢式 執行緒不安全 傳統的懶漢式建立單例模式,是執行緒不安全的 public class singleton p...

執行緒安全的單例模式

廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...

執行緒安全的單例模式

單例模式是為了保證乙個類只有乙個例項而且易於外界訪問。所以一般只有把建構函式,拷貝函式,析構函式,賦值函式,變數名變為私有。再用乙個get函式訪問提供介面即可。考慮執行緒安全就要加鎖。一 懶漢模式 1 靜態成員例項的懶漢模式 class singleton public static singlet...