單例模式,一般的單例模式可分為以下兩種:
1 餓漢式:
public class singleton
public singleton getinstance()
} 2 懶漢式:
public class singleton
return singleton;
}}
安全分析:
1 從執行緒角度:
從執行緒角度看,我們會發現,餓漢式是執行緒安全的,在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不在改變,懶漢式如果在建立例項物件時不加上synchronized則會導致對物件的訪問不是執行緒安全的,所以在使用懶漢式時我們的考慮到執行緒安全問題
改進後的懶漢式:
public class singleton
return singleton;
}}
2 從安全角度:
ok,執行緒安全我們解決了,但是對於有些對系統的安全要求再高些的那,比如:作業系統的許可權,
提醒下,在享有特權的客戶可以借助accessibleobject.setaccessible方法,通過反射機制來呼叫你的私有構造器。如果你的系統需要的安全級別比較高的話,為了抵禦這用攻擊,可以修改構造器,讓它在被要求建立第二個例項的時候丟擲異常。
3 從序列化角度:
我有時候會用到序列化,那怎樣保證單例模式的安全?難道就僅僅在宣告中加上」implements serializable「就可以?這不夠的,為了保證單列,我們還得宣告所有例項域都是瞬時的,並提供乙個readresolve方法,否則我們每次反序列化乙個序列化的例項時,都會建立乙個新例項,針對需要序列化的,我們可以加上這個方法:
private object readresolve(){
return singleton;
這只是我所想到和看到的,當然有不足之處還請大家多指教!
你的單例模式安全嗎
今天在寫乙個東西需要用的單例模式,一般的單列模式可分為以下兩種 1 餓漢式 public class singleton public singleton getinstance 2 懶漢式 public class singleton return singleton 安全分析 1 從執行緒角度 ...
你的單例模式真的是執行緒安全的嗎
在我們平時的專案中,單例模式是十分常見的設計模式,當然我們使用最多的是 懶漢式 public class singleton public static singleton getinstance return instance 在初始化的時候我們使用雙重判斷的方式來確保只會被初始化一次,看上去很完...
單例模式執行緒安全嗎《十二》
單例模式執行緒安全嗎?單例模式作為一種常見的設計模式,在程式中非常常見,主要是為了保證乙個類只有乙個唯一的物件。從簡單的 餓漢式 懶漢式 利用 synchronized 和 複雜的 雙重校驗dcl模式 是乙個考慮執行緒安全的過程那麼單例模式執行緒安全嗎 1.靜態的餓漢式單例模式是執行緒安全的 那非靜...