單例實(shí)現(xiàn)方式:
? ? ? ? 1.單例裝飾器;
? ? ? ? 2.使用類浸颓;
? ? ? ? 3.使用元類 ? ? ? ? ? ?
1.單例裝飾器(非線程安全)
? ? 通過(guò)裝飾器使一個(gè)類變成單例類,但是并非線程安全的,多線程狀態(tài)下,每個(gè)線程創(chuàng)建不同的實(shí)例,因?yàn)闆](méi)有加線程鎖雀费,所以無(wú)法阻止其他線程創(chuàng)建新的實(shí)例,代碼如下:
調(diào)用多線程執(zhí)行函數(shù):
結(jié)果:
2.使用類的方式實(shí)現(xiàn)單例(非線程安全)
結(jié)果:
怎么實(shí)現(xiàn)單例線程安全痊焊,通常做法就是加線程鎖:
結(jié)果:
加了線程鎖后盏袄,可以實(shí)現(xiàn)創(chuàng)建單例線程安全;
3.使用元類
結(jié)果:
總結(jié):
? ? ? ? 1.不管用什么方式實(shí)現(xiàn)單例薄啥,其主要邏輯都是判斷是否存在已經(jīng)創(chuàng)建的實(shí)例辕羽,有就返回已經(jīng)創(chuàng)建過(guò)的實(shí)例,沒(méi)就實(shí)例化一個(gè)實(shí)例并存儲(chǔ)起來(lái)垄惧;
? ? ? ? 2.單例在單線程模型下刁愿,是線程安全的,不管怎么樣創(chuàng)建實(shí)例到逊,都有且只有一個(gè)铣口,而面對(duì)多線程任務(wù)時(shí)滤钱,一般的單例代碼無(wú)法承擔(dān)多線程任務(wù),當(dāng)有io延時(shí)操作時(shí)脑题,會(huì)生成id不同的實(shí)例菩暗,所以如果需要實(shí)現(xiàn)多線程單例,那么就在創(chuàng)建實(shí)例時(shí)增加線程鎖;
? ? ? ? 3.實(shí)現(xiàn)單例的方式不止三種旭蠕,只要你抓住if判斷的主要邏輯點(diǎn),就能實(shí)現(xiàn)單例旷坦,所以單例的實(shí)現(xiàn)方式是多種多樣的掏熬,這里列舉了比較常用的三種;