程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 多線程-關於單利模式中的懶人模式

多線程-關於單利模式中的懶人模式

編輯:編程解疑
關於單利模式中的懶人模式

最近面試,被要求寫多線程並發狀態下的單例模式,隨寫了懶人模式

 public class Singleton
{
    private Singleton(){}
    public static readonly Singleton instance = new Singleton();
}  

被問道,如何在多線程並發的狀態下保證單例模式,查了半天對readonly 是如何保證並發狀態的下,多個線程同時調用instance變量而產生單例的原理沒有找到,求大神給講講呗!

最佳回答:


你的代碼,的確可以保證單例, 靜態屬性初始化,系統會保證線程安全的

但是你的代碼不是延遲模式,或懶人模式噢

只要任何使用到這個類,無論什麼方法,就會初始化靜態變量,
比如這個類如果還有其他靜態方法,那麼訪問這些方法時,就會建立對象了

延遲創建,肯定要求只訪問這個屬性時才建立對象,所以你必須寫一個靜態方法,在方法裡創建對象

這裡考慮效率,無非就是檢查兩次對象是否建立
if (o == null){
鎖定
if (o==null) o=new ...
釋放
}
return o

對比代碼
if (o==null) o=new
如果兩個線程同時檢查o,當然都是null,然後兩個同時創建對象,等於就創建兩次了

而代碼
鎖定
if(o==null) o=new
釋放

則每次執行都要鎖,效率太低了,

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved