不使用synchronized和lock,CAS实现一个线程安全的单例模式

package com.example.demo;

import java.util.concurrent.atomic.AtomicReference;

public class Singleton {
    private static final AtomicReference INSTANCE = new AtomicReference();

    private Singleton() {}

    public static Singleton getInstance() {
        for (;;) {
            Singleton singleton = INSTANCE.get();
            if (null != singleton) {
                return singleton;
            }

            singleton = new Singleton();
            if (INSTANCE.compareAndSet(null, singleton)) {
                return singleton;
            }
        }
    }
}

 

CAS的一个重要缺点在于如果忙等待一直执行不成功(一直在死循环中),会对CPU造成较大的执行开销。

另外,如果N个线程同时执行到singleton = new Singleton();的时候,会有大量对象创建,很可能导致内存溢出。

 

你可能感兴趣的:(java)