并发环境下性能更高的单例模式写法

292 阅读1分钟

并发环境下性能更高的单例模式写法

getAcquire()、setRelease()Java9 中提供的方法

import java.util.concurrent.atomic.AtomicReference;


public class Singleton {

    static class DbConnection {
        DbConnection() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    static AtomicReference<DbConnection> ref = new AtomicReference<>();

    public static DbConnection getDb() {
        // java9
        var localRef = ref.getAcquire();
        if (localRef == null) {
            synchronized (Singleton.class) {
                localRef = ref.getAcquire();
                if (localRef == null) {
                    ref.setRelease(new DbConnection());
                }
            }
        }
        return localRef;
    }

    public static void main(String[] args) {
        for (var i = 0; i < 20; i++) {
            new Thread(() -> {
                getDb();
            }).start();
        }
    }

}