简单了解单例模式

时间:2024-03-26 11:18:33
// 1.线程不安全 class Singleton02 { private static volatile Singleton02 instance = null;//声明对象,不实例化 public static Singleton02 getInstance(){//向外提供访问该类对象的方法 if (instance == null){ instance = new Singleton02(); } return instance; } } // 2.double-check锁保证线程安全 class Singleton02 { // 由于锁已经保证了可见性,这里volatile的作用是防止new过程中的指令重排 private static volatile Singleton02 instance = null;//声明对象,不实例化 public static Singleton02 getInstance(){//向外提供访问该类对象的方法 if (instance == null){ synchronized(Singleton02.class){ if(instance == null){ instance = new Singleton02(); } } } return instance; } } // 3.CAS实现无锁线程安全创建单例 public class Singleton02 { private static AtomicReference<Singleton02> instanceRef = new AtomicReference(); public static Singleton02 getInstance() {//向外提供访问该类对象的方法 // CAS配合自旋,CAS有volatile的语义,AtomicReference的实现是value用volatile修饰 for (; ; ) { Singleton02 instance = instanceRef.get(); if (instance != null) return instance; instanceRef.compareAndSet(null, new Singleton02()); } } }