當前位置:編程學習大全網 - 源碼下載 - 枚舉線程安全嗎?

枚舉線程安全嗎?

為什麽枚舉類型是線程安全的?

我們定義的壹個枚舉,在第壹次實際使用的時候會被虛擬機加載初始化,這個初始化過程是線程安全的。而我們知道,要解決單例的並發問題,主要解決的是初始化過程中的線程安全問題。

因此,由於枚舉的上述特性,枚舉實現的singleton本質上是線程安全的。

為什麽反序列化枚舉類型不會創建新的實例?

Java在序列化枚舉類型時,只將枚舉對象的name屬性輸出到結果中,在反序列化枚舉類型時,使用java.lang.Enum的valueOf方法,根據名稱查找枚舉對象。同時,編譯器不允許對這種序列化機制進行任何自定義,因此禁用了writeObject、readObject、readObjectNoData、writeReplace和readResolve等方法。

在普通Java類的反序列化過程中,通過反射調用類的默認構造函數來初始化對象。因此,即使singleton中的構造函數是私有的,也會被反射破壞。因為反序列化的對象是新創建的,所以這會破壞singleton。(使用雙重檢查鎖實現的singleton其實有壹些問題,就是這個singleton可能會被序列化鎖破壞。)

普通類的反序列化是通過反射實現的,枚舉類的反序列化不是通過反射實現的。所以枚舉類不會有反序列化導致的單體破壞問題。源代碼基於jdk1.8

喜歡的可以關註壹下。

  • 上一篇:高情商決定您的社交
  • 下一篇:發電機轉矩是如何計算的?有公式嗎?
  • copyright 2024編程學習大全網