差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

java:effective_java:concurrency:use_lazy_initialization_judiciously [2020/02/02 12:47]
tony 建立
java:effective_java:concurrency:use_lazy_initialization_judiciously [2023/06/25 09:48]
行 1: 行 1:
-{{tag>​java effective_java java_concurrency}} 
-====== Effective Java - Use lazy initialization judiciously ====== 
-===== Problem ===== 
-這個Item是在探討使用Lazy initialization的時機與方法,而在多執行緒存取的時,較容易發生問題。如以下程式要初始化一個Singleton物件,但在多執行緒的情況下,Client可能會拿到不是唯一的instance:​ 
-<code java> 
-public class Singleton { 
-  
- private static Singleton instance; 
-  
- public static Singleton get() { 
- if( instance == null ) { 
- instance = new Singleton();​ 
- } 
- return instance; 
- } 
-} 
-</​code>​ 
-===== Normal Initialization ===== 
-在一般情況下,因為JVM ClassLoader載入類別是Thread-Safe,直接使用以下方法就不會有Multi-thread的問題:​ 
-<code java> 
-private final static Singleton instance = new Singleton();​ 
-</​code>​ 
-但如果初始化這個物件的效能成本很大,希望能等到有使用到才初始化,就不適用這種做法。 
-===== Synchronized Method ===== 
-針對要做延遲初始化又要Thread-Safe,我年輕時且目前看到最多人使用的寫法如下:​ 
-<code java> 
-public synchronized static Singleton get() { 
-//... 
-} 
-</​code>​ 
-這做法的缺點就是在初始化之後,每一個Thread要存取時,都會受到這個synchronized的影響而慢一點。 
  
-===== Note ===== 
-Effective Java第三版Item 83。 
-===== Reference ===== 
-  * Java Threads, 3/e 
-  * Java高併發編程詳解:多線程與架構設計,​ 汪文君 
-=====    ===== 
----- 
-\\ 
-~~DISQUS~~