网站导航html源码,电商网站设计说明书,软件外包,wordpress技术博客模板什么是单例模式
对于一个类#xff0c;只有一个实例化的对象#xff0c;我们构建单例模式一般有两种#xff1a;饿汉式和懒汉式 饿汉式
优点是无线程安全问题#xff0c;类加载就创建对象缺点是占内存
class Singleton01{private static Singleton01 instance new Sing…什么是单例模式
对于一个类只有一个实例化的对象我们构建单例模式一般有两种饿汉式和懒汉式 饿汉式
优点是无线程安全问题类加载就创建对象缺点是占内存
class Singleton01{private static Singleton01 instance new Singleton01();//声明对象同时私有化public static Singleton01 getInstance(){//向外声明访问该类对象的方法return instance;}
}懒汉式
优点是延迟加载创建后才占用内存缺点是有线程安全问题需要双重检查锁保证
// 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 AtomicReferenceSingleton02 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());}}
}Spring的单例模式
在Spring中bean的scope有几种常见的如singleton、prototype、request、session等默认是singleton也就是Spring的bean默认是单例的在getBean()的时候默认先从缓存拿如果没有才懒加载创建bean并且创建完成之后加入缓存。
// 一级缓存beanName - 实例化并且初始化的成品
private final MapString, Object singletonObjects new ConcurrentHashMap(256);