饿汉式
忽略
懒汉式
说它是懒汉式,因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance
public class Singleton {
/**
* 静态内部类保证线程同步
* @author panqian
*
*/
private static class SingletonHolder{
private static Singleton singleton = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.singleton;
}
}
双重检查
也属于懒汉式
public class Singleton {
private static volatile Singleton obj;
private Singleton() {
}
public static Singleton getInstance() {
if (obj == null) {
synchronized (Singleton.class) {
if (obj == null) {
obj = new Singleton();
}
}
}
return obj;
}
}
CAS方式
懒汉式,饿汉式,其实现原理都是利用借助了类加载的时候初始化单例。即借助了ClassLoader的线程安全机制。
所谓ClassLoader的线程安全机制,就是ClassLoader的loadClass方法在加载类的时候使用了synchronized关键字。也正是因为这样, 除非被重写,这个方法默认在整个装载过程中都是同步的,也就是保证了线程安全。
所以,以上各种方法,虽然并没有显示的使用synchronized,但是还是其底层实现原理还是用到了synchronized。
public class Singleton {
private static volatile AtomicReference<Singleton> atomicReference = new AtomicReference();
private Singleton() {
}
public static Singleton getInstance() {
while (true) {
Singleton singleton = atomicReference.get();
if (null == singleton) {
//如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。
atomicReference.compareAndSet(null, new Singleton());
continue;
}
return singleton;
}
}
}
评论区