差異處
這裏顯示兩個版本的差異處。
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~~ |