執行緒安全的單例模式

2021-09-22 13:22:11 字數 1212 閱讀 9669

面試的時候,常常會被問到這樣乙個問題:請您寫出乙個單例模式(singleton pattern)吧。好吧,寫就寫,這還不容易。順手寫乙個:

public final class eagersingleton  

public static eagersingleton getsingleinstance()  

}  

這種寫法就是所謂的

public final class lazysingleton  

public static lazysingleton getsingleinstance()  

}  

這種寫法就是所謂的

public final class threadsafesingleton  

public staticsynchronizedthreadsafesingleton getsingleinstance()  

}  

寫到這裡,面試官可能仍然會狡猾的看了你一眼,繼續刁難到:這個寫法有沒有什麼效能問題呢?答案肯定是有的!

public final class doublecheckedsingleton  

public static doublecheckedsingleton getsingleinstance()

}return singobj;

}  }  

這種寫法使得只有在載入新的物件進行同步,在載入完了之後,其他執行緒在第九行就可以判斷跳過鎖的的代價直接到第15行**了。做到很好的併發度。

至此,上面的寫法一方面實現了lazy-load,另乙個方面也做到了併發度很好的執行緒安全,一切看上很完美。這是,面試官可能會對你的回答滿意的點點頭。但是,你此時提出說,其實這種寫法還是有問題的!!問題在**?假設執行緒a執行到了第9行,它判斷物件為空,於是執行緒a執行到第12行去初始化這個物件,但初始化是需要耗費時間的,但是這個物件的位址其實已經存在了。此時執行緒b也執行到了第九行,它判斷不為空,於是直接跳到15行得到了這個物件。但是,這個物件還

那麼有沒有什麼更好的寫法呢?有!這裡又要提出一種新的模式——

public class singleton    

public static singleton getinstance()    

}  

double-checked lock:

initialzation on demand holder: 

執行緒安全的單例模式

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

執行緒安全的單例模式

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

執行緒安全的單例模式

在我們專案中,很多時候需要程式只存在乙個唯一例項。通常在專案中我會把單例模式寫成如下形式 public class singleton public static singleton getinstance return msingleton 通常以這種形式返回乙個類的唯一例項,然而在android...