Java 011 Singleton的设计方法(双检锁)

2020-04-18  本文已影响0人  攻城狮托马斯

Eager Singleton(及時Singleton)

public class eagerSingleton {

 private static final eagerSingleton INSTANCE = new eagerSingleton();

 private eagerSingleton(){};

 public static eagerSingleton getInstance() {

      return INSTANCE;

  }

}

//這是eager singleton因為一旦class initiate, instance就存在了

Lazy Singleton(懶惰update, 等需要singleton的時候再創立)

public class lazySingleton {

private static final lazySingleton INSTANCE;

private lazySingleton(){};

public static lazySingleton getIntance() {

if(INSTANCE == null) {

    INSTANCE = new lazySingleton();

}

return INSTANCE;

}

}

只有在其他人想要獲得Singleton的時候才會initialize 一個instance. 

Singleton的實現在於,constructor設爲private, 這樣的話就可以控制數量,而getSingleton則設置為public.

线程安全式Singleton写法(双检索), 

锁住initialize instance拿一部分代码就可以

public class Singleton {

private static volatile Singleton INSTANCE;

private Singleton(){}; //private constructor

public Singleton getIntance() {

if(INSTANCE == NULL) {

synchronized(Singleton.class) {

if(INSTANCE == NULL) {

INSTANCE = new Singleton();

}

}

}

}

}

写两遍检查的原因是,当多个进程进入第一个判断锁时,会被同步机制隔离,只有一个程序进入新建对象,再其他线程进入时,instance已经不为null,因此不会新建多个对象。

Volatile的作用:

1.保持可见性 2.不保证原子性 3.禁止指令重排.

上一篇 下一篇

猜你喜欢

热点阅读