當一個類中的方法被多個線程調用時,方法中可能有對公共的資源進行操作,如果不讓它一個個有順序的執行那麼公共資源的數據可能產生錯亂, 解決方法 單例模式 說明: 實現單例模式,也就是這個類一次只能實例化一次,當使用完後才能進行下一次實例化,這樣才能保證這個類里的方法每次只執行一次 最好的單例模式: 用枚 ...
當一個類中的方法被多個線程調用時,方法中可能有對公共的資源進行操作,如果不讓它一個個有順序的執行那麼公共資源的數據可能產生錯亂,
解決方法
----------------------------------------------------------------------------------------------------------------------------------------------------單例模式
說明: 實現單例模式,也就是這個類一次只能實例化一次,當使用完後才能進行下一次實例化,這樣才能保證這個類里的方法每次只執行一次
最好的單例模式: 用枚舉實現單例模式
原因: 定義枚舉時使用enum 和 class 一樣,是java中的一個關鍵字,就像class對應一個Class類一樣,enum也對應有一個Enum類
通過源碼分析,各個枚舉項都是通過static定義的,而java的類載入機制對static類型屬性會在類被載入之後被初始化,因為虛擬機
在載入類的時候會使用ClassLoader的loadClass方法,而這個方法使用同步代碼塊保證了線程安全,所以創建一個enum類型是線程
安全的,而單例模式主要就是解決線程安全問題,用枚舉天生就是線程安全的
用枚舉還可以防止反序列化破壞單例的情況,普通類反序列化過程,會通過反射調用類的預設構造函數一初始化對象,即使定義了構造函數是private的,也會被破壞,就可以出現多個new出來對象,單例模式就會被破壞,但是枚舉的反序列化並不是通過反射實現的,不會出現 單例被破壞的情況
總結: jvm中保證了枚舉是線程安全的,反序列化時不同於普通的類不會重新new出來對象。