초기화 지연 초기화로 초기화 클래스와 창설 대상의 비용을 낮추다
2046 단어 JVM--잡담
Java , 。
CASE:
public class Singleton{
private static Singleton instance = null;
private Singleton(){ //
}
public static Singleton getInstance(){
if(instance == null){ //
synchronized (Singleton.class) { //
if (instance == null) { //
instance = new Singleton(); // instance
}
}
}
return instance;
}
}
:
1) A instance = new Singleton(); 3 :
① 、 ( -> -> )。
② 。 : , 。
③ instance 。 : 。
2) ② ③ :
--> instance 。( , !) --> 。
3) , B instance null, B instance , A !
2 :
1) volatile , ② ③ 。
: volatile ,② ③ , 。
: 、 。
public class Singleton{
private volatile static Singleton instance = null;
private Singleton(){ //
}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class) {
if (instance == null) {
// instance volatile , instance 。
instance = new Singleton();
}
}
}
return instance;
}
}
2) ( ), ② ③ , “ ” 。
:
[1] , Class , A Class , , , 。
[2] :
1> new
2> ( : final 、 )。
3> 。
public class Singleton{
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance; // SingletonHandler
}
}