簡體   English   中英

JVM如何確保線程安全使用枚舉實現Singleton?

[英]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來修改類的內部結構來修改枚舉。 一般來說,這不是一個好主意。

來自JLS 8.9.2

對於名稱為n的每個聲明的枚舉常量,枚舉類型具有一個隱式聲明的名為n的類型為E的公共靜態最終字段。在顯式聲明任何靜態字段之前,這些字段被認為是以與相應的枚舉常量相同的順序聲明的。在枚舉類型中。

枚舉是靜態實例,它們將在類加載時初始化。 初始化后,您無法更改/修改它們。 所以這是線程安全的。 創建后,不會修改Enum實例。

但是,除非明確聲明,否則添加到枚舉類的方法不會帶有任何線程安全保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM