[英]How JVM ensures thread safety Singleton implemented by use of enum?
根據Josh Bloch的Effective Java Enum是實現Singleton模式的最佳方式。
Java enum自己負責序列化和線程安全。 但我不明白怎么做。
有人可以解釋一下嗎?
第二個鏈接提供了關於enum能夠序列化的大量細節,但我沒有得到關於線程安全性的充分解釋。
在枚舉中聲明的方法是線程安全的還是必須特別小心?
static
初始化程序塊是使用JVM內部的Lock的單線程。 即它不像其他鎖一樣出現在jstack
跟蹤中。 在初始化之前,沒有其他線程可以訪問該類的任何內容。 所有類都是如此,而不僅僅是enum
。
enum
在編譯器生成的靜態初始化程序塊中初始化。
在枚舉中聲明的方法是線程安全的還是必須特別小心?
同樣, enum
就像常規課程一樣。 僅synchronized
標記為已同步的方法。 注意:只添加synchronized不會使其線程安全。 ;)
雖然enum
是有效的static final
實例,但您可以修改它們的字段,即。 默認情況下,枚舉上的字段不是final
字段。 您還可以使用反射和Unsafe.allocateInstance來修改類的內部結構來修改枚舉。 一般來說,這不是一個好主意。
對於名稱為n的每個聲明的枚舉常量,枚舉類型具有一個隱式聲明的名為n的類型為E的公共靜態最終字段。在顯式聲明任何靜態字段之前,這些字段被認為是以與相應的枚舉常量相同的順序聲明的。在枚舉類型中。
枚舉是靜態實例,它們將在類加載時初始化。 初始化后,您無法更改/修改它們。 所以這是線程安全的。 創建后,不會修改Enum實例。
但是,除非明確聲明,否則添加到枚舉類的方法不會帶有任何線程安全保證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.