眾所周知,單例模式主要就是將建構函式宣告為private,來防止外部呼叫例項化。**如下:
public class singleton
public static singleton getinstance()
return uniqueinstance;}}
這段邏輯,在單執行緒的程式中工作得很好。但是,當引入多執行緒時,就可能會出現問題。
示意圖如下:
示意圖使用synchroinzed關鍵字,使程式在執行時,同一時刻,只有乙個執行緒執行getinstance方法。
public class singleton
public static synchronized singleton getinstance()
return uniqueinstance;}}
適用場景:
getinstance的效能對應用程式不是關鍵。因為這種方法會嚴重降低效能,而且只有第一次執行getinstance方法的時候,才需要同步。之後所有執行此方法時,都不需要同步鎖了。(個人覺得,用了synchronized後,只有在未初始化的時候,效能影響會比較大。之後所有執行次方法,只是直接返回例項了,所以對效能影響有限)
在應用程式宣告這個類的時候,就執行例項化。
public class singleton
public static singleton getinstance()
}
適用場景:
如果應用程式總是建立並使用單例模式,或者在建立和執行時方面的負擔不太繁重。它是最簡單、最清楚的替代方法。
靜態初始化器如何保證例項只會被建立一次?
剛開始,我以為靜態方法在程式啟動時,會載入所有類的靜態初始化器,從而保證例項只會有乙個。
public class singleton
public static singleton getinstance()
}public class main
}
這段程式實際的執行結果卻是:
main
create ins
原來,靜態初始化器是保證執行緒安全的。在每次載入類的時候才會去執行靜態初始化器。乙個類只會被載入一次,如果乙個類被載入了兩次,執行時類名就會衝突了。所以jvm會保證靜態初始化器是執行緒安全的。
首先檢查是否例項已經建立了,如果尚未建立,才進行同步。這樣一來,只有第一次會同步。
public class singleton
public static singleton getinstance() }}
return uniqueinstance;}}
volatile
volatile是輕量級的synchronized,它在多處理器開發中保證了共享變數的「可見性」。可見性的意思是當乙個執行緒修改乙個共享變數時,另外乙個執行緒能讀到這個修改的值。
public class singleton
public static singleton getinstance()
}
適用場景:
處於效能的考慮而需要對靜態域使用延遲初始化。
多執行緒情況下單例模式的實現
單例模式是一種設計模式,分為懶漢式和餓漢式兩種實現方式 public class singleton public static singleton getinstance 優點 這種寫法比較簡單,就是在類裝載的時候就完成例項化。避免了執行緒同步問題。缺點 在類裝載的時候就完成例項化,沒有達到laz...
單例模式併發處理的4種方式
眾所周知,單例模式主要就是將建構函式宣告為private,來防止外部呼叫例項化。如下 public class singleton public static singleton getinstance return uniqueinstance 這段邏輯,在單執行緒的程式中工作得很好。但是,當引入...
高併發情況下 如何支撐大量的請求
幾點需要注意 盡量使用快取,包括使用者快取,資訊快取等,多花點記憶體來做快取,可以大量減少與資料庫的互動,提高效能。用jprofiler等工具找出效能瓶頸,減少額外的開銷。優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句 僅耗時較長的查詢做優化 優化資料庫結構,多做索引,提高查...