今天領導問了個問題說單例模式中,物件的變數是否是執行緒安全的。起初都不太確定,後來本著裝的目的,試了一下,結果是否定的。在多執行緒環境下,物件的成員變數是不安全的。
package com.zhuyang.test;
public class singleton
public static synchronized singleton getinstance()
public int getcount()
public void setcount(int count)
}
上面的**是一段標準的單例模式。 其中有個成員變數count.他的值,會再多執行緒環境下不斷修改。
package com.zhuyang.test;
public class test
}class threadtest extends thread
@override
public void run()
public int getthreadid()
public void setthreadid(int threadid)
}
執行上面的**結果:
thread-0is updating count value is=1111, count value of singleton is=4444
thread-4is updating count value is=5555, count value of singleton is=4444
thread-5is updating count value is=6666, count value of singleton is=4444
thread-2is updating count value is=3333, count value of singleton is=4444
thread-6is updating count value is=7777, count value of singleton is=4444
thread-3is updating count value is=4444, count value of singleton is=4444
thread-1is updating count value is=2222, count value of singleton is=4444
說明,多執行緒中,單例模式並非執行緒安全,即便是加上了synchronized關鍵字。
那麼如何做到執行緒安全呢?做法就是把物件給synchronized掉,看**。
package com.zhuyang.test;
public class test
}class threadtest extends thread
@override
public void run()
}public int getthreadid()
public void setthreadid(int threadid)
}
結果:thread-0is updating count value is=1111, count value of singleton is=1111
thread-1is updating count value is=2222, count value of singleton is=2222
thread-2is updating count value is=3333, count value of singleton is=3333
thread-3is updating count value is=4444, count value of singleton is=4444
thread-4is updating count value is=5555, count value of singleton is=5555
thread-6is updating count value is=7777, count value of singleton is=7777
thread-5is updating count value is=6666, count value of singleton is=6666
c 多執行緒單例模式 執行緒安全C 單例模式
我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...
設計模式 單例模式(執行緒安全)
前言 單例模式是設計模式中比較簡單的一種,但是又因為簡單常見在面試中又是經常出現的乙個設計模式。所以必須要會啊。之前也只是會寫執行緒不安全的單例模式。單例模式 乙個類能返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 當我們呼叫這個方法時...
執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...