多執行緒下單重判斷懶漢式的低效原因分析及改進

2021-07-11 01:54:49 字數 730 閱讀 8072

單例模式下的懶漢式在多執行緒的情況下會出現安全隱患,所以需要加入同步機制,以解決問題,**如下:

class single

private static single s = null;

public static synchroized single getinstance()

} return s;

}

對以上**進行分析。假設現在有多個執行緒(thread-0,thread-1.......thread-n)同時執行,thread-0拿到鎖,判斷完if語句後,時間片執行完。cpu切換到thread-1,thread-1判斷鎖,但不能拿到鎖,所以不能執行。cpu又切換到thread-0繼續執行完。後面的其它執行緒每次進入時都需要先判斷鎖(這本就沒用了,因為thread-0已經建立了物件),然後在判斷s是否為空。增加了鎖判斷的次數,明顯降低了程式效率。改進方法,即加雙重判斷,減少判斷鎖的次數。**實現如下:

class single

private static single s = null;

public static single getinstance()

} return s; }}

這樣一旦某個執行緒建立了物件,其他執行緒在第一次if判斷時,不成立,即完成了當前方法的執行,減少了判斷鎖的次數,從而提高了效率。

小結:如何解決安全問題:加同步。如何解決低效問題:加雙重判斷。

單例模式的懶漢式在多執行緒的問題

我們都知道,單例設計模式中有兩種方法,一種是餓漢式,另外一種就是懶漢式,具體如下 餓漢式 package com.seven.exercise.testeception 單例模式,餓漢式 author seven public class singledemohunger private stati...

單例模式,懶漢式在多執行緒中的問題

singleton2實現單例模式,懶漢式 class singleton2 private static singleton2 singleton2 public static singleton2 getsingle2 catch interruptedexception e singleton2...

單例模式 懶漢式的一次多執行緒Debug

單例模式要要點就是乙個類只會存在乙個例項,要想達到這種效果,最重要的就是將構造方法設定為私有,然後通過static的方法來獲取物件。上述設計並不執行緒安全,因為在lazysingleton new lazysingletion 這一步可能會傳送執行緒的切換,導致出現多個lazysingletion物...