多執行緒環境下單例模式的一種實現方式

2021-09-02 09:01:28 字數 899 閱讀 7159

最近在看dubbo的源**,發現dubbo類extensionloader中有一段**:

private static final concurrentmap, extensionloader<?>> extension_loaders = new concurrenthashmap, extensionloader<?>>();

public static extensionloadergetextensionloader(classtype)

if(!withextensionannotation(type))

extensionloaderloader = (extensionloader) extension_loaders.get(type);

if (loader == null)

return loader;

}

extension_loaders.putifabsent(type, new extensionloader(type));  

loader = (extensionloader) extension_loaders.get(type);

不明白作者這段**的用意,為什麼不如下面這麼寫:

loader = new extensionloader(type);

extension_loaders.putifabsent(type,loader);

這麼寫的玄機是什麼?

不用這裡寫法,是為了保證取的物件是同乙個

putifabsent是key存在就不替換,這裡return回去的都是從map裡get出來的,而不是new出來的

對建構函式的封裝,使用併發的concurrenthashmap實現多執行緒下的單例模式

多執行緒環境下單例模式的兩種實現方法

單例一 public class singleton public static synchronized singleton getinstance return instance 這種寫法雖然是多執行緒安全的,但是每次使用getinstance方法都需要進行同步,因此,效率比較低。單例二 pub...

多執行緒情況下單例模式的實現

單例模式是一種設計模式,分為懶漢式和餓漢式兩種實現方式 public class singleton public static singleton getinstance 優點 這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。缺點 在類裝載的時候就完成例項化,沒有達到laz...

多執行緒環境下實現單例模式

1 餓漢式 就是在使用類時就將物件建立完畢 例項 public class myobject public static myobject getinstance 測試 public static void main string args 結果 可見hashcode的值一樣的。所有相同物件 2 懶...