在所有java的版本里答倡,這個方法都能達到安全、高效的實現(xiàn)高并發(fā)的延遲初始化驴党。
Code:
public class Something {
? ? private Something() {}
? ? private static class LazyHolder {
? ? ? ? private static final Something INSTANCE = new Something();
? ? }
? ? public static Something getInstance() {
? ? ? ? return LazyHolder.INSTANCE;
? ? }
}
這種實現(xiàn)依賴于在JVM中初始化階段的特性瘪撇,這在java 語言說明里有交代。當一個類被JVM加載遣钳,這個類就會歷經(jīng)初始化的過程。既然這個類沒有其他靜態(tài)的變量需要初始化为朋,那么初始化過程就會順利完成媚朦。而定義在類里面的靜態(tài)類LazyHolder直到JVM確定LazyHolder一定會被執(zhí)行時才會去初始化。當靜態(tài)方法getInstance調(diào)用時撑毛,靜態(tài)類LazyHolder才會被執(zhí)行,當這件事第一次發(fā)生時,JVM就會去加載并初始化LazyHolder歼捏。
LazyHolder 的初始化導致了靜態(tài)變量INSTANCE因為外部類(就是指LazyHolder)執(zhí)行私有的構(gòu)造器而被初始化。由于類的初始化過程是串行的(由java語言說明保障)笨篷,就無需并行同步操作了瞳秽。
并且,因為初始化階段在串行操作里寫入靜態(tài)變量INSTANCE率翅,所有接下來的并行調(diào)用getInstance方法會正確返回相同的INSTANCE练俐,而不需要額外的同步開銷。