差異處
這裏顯示兩個版本的差異處。
Both sides previous revision 前次修改 下次修改 | 前次修改 下次修改 Both sides next revision | ||
java:effective_java:concurrency:use_lazy_initialization_judiciously [2020/02/02 13:24] tony |
java:effective_java:concurrency:use_lazy_initialization_judiciously [2020/02/02 17:26] tony [Double-check idiom] |
||
---|---|---|---|
行 61: | 行 61: | ||
synchronized(Singleton.class) { | synchronized(Singleton.class) { | ||
- | if( instance != null ) { // with locking | + | result = instance; |
- | return instance; | + | if( result != null ) { // with locking |
+ | return result; | ||
} | } | ||
行 88: | 行 89: | ||
這一樣是透過ClassLoader載入Class Thread-Safe的機制,來解決同步存取的問題。目前這是要初始化static欄位的首選。 | 這一樣是透過ClassLoader載入Class Thread-Safe的機制,來解決同步存取的問題。目前這是要初始化static欄位的首選。 | ||
===== Enum method ===== | ===== Enum method ===== | ||
- | 這方法是看Java高併發編程詳解:多線程與架構設計這本書時,有提到透過Enum去解這問題是Effective Java作者力推的方法,但我在第二版與第三版中並沒看到,可能是第一版的內容。在這我就稍微說明Enum method的做法。 | + | 這方法是看Java高併發編程詳解:多線程與架構設計這本書時,有提到透過Enum去解這問題是Effective Java作者力推的方法,在Item89有提及。在這我就稍微說明Enum method的做法: |
+ | <code java> | ||
+ | public enum Singleton { | ||
+ | |||
+ | INSTANCE; | ||
+ | |||
+ | public static Singleton get() { | ||
+ | return INSTANCE; | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | Enum擁有Thread-safe、只能被初始化一次且不能夠被繼承的特性;缺點就是無法做Lazy initialization,要解決這問題可以與Holder方式結合。但與其這樣,不如使用Holder就好。 | ||
+ | |||
===== Note ===== | ===== Note ===== | ||
Effective Java第三版Item 83。 | Effective Java第三版Item 83。 |