單例實現(xiàn)方式:
? ? ? ? 1.單例裝飾器;
? ? ? ? 2.使用類;
? ? ? ? 3.使用元類 ? ? ? ? ? ?
1.單例裝飾器(非線程安全)
? ? 通過裝飾器使一個類變成單例類,但是并非線程安全的,多線程狀態(tài)下,每個線程創(chuàng)建不同的實例,因為沒有加線程鎖,所以無法阻止其他線程創(chuàng)建新的實例,代碼如下:

調用多線程執(zhí)行函數(shù):

結果:

2.使用類的方式實現(xiàn)單例(非線程安全)

結果:

怎么實現(xiàn)單例線程安全,通常做法就是加線程鎖:

結果:

加了線程鎖后,可以實現(xiàn)創(chuàng)建單例線程安全;
3.使用元類

結果:

總結:
? ? ? ? 1.不管用什么方式實現(xiàn)單例,其主要邏輯都是判斷是否存在已經創(chuàng)建的實例,有就返回已經創(chuàng)建過的實例,沒就實例化一個實例并存儲起來;
? ? ? ? 2.單例在單線程模型下,是線程安全的,不管怎么樣創(chuàng)建實例,都有且只有一個,而面對多線程任務時,一般的單例代碼無法承擔多線程任務,當有io延時操作時,會生成id不同的實例,所以如果需要實現(xiàn)多線程單例,那么就在創(chuàng)建實例時增加線程鎖;
? ? ? ? 3.實現(xiàn)單例的方式不止三種,只要你抓住if判斷的主要邏輯點,就能實現(xiàn)單例,所以單例的實現(xiàn)方式是多種多樣的,這里列舉了比較常用的三種;