网站建设与制作教学计划,重庆本地建站,wordpress使用hexo主题,爱站网关键词挖掘工具熊猫单例模式
什么是单例模式#xff1f;
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。
应用#xff1a;数据库的连接类#xff0c;这样就可以确保只创建一次。节省资源。
单例模式代码#xff1a;涉及懒加载…单例模式
什么是单例模式
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。
应用数据库的连接类这样就可以确保只创建一次。节省资源。
单例模式代码涉及懒加载、双重检查锁、volatile防止指令重排。
懒加载在调用方法的时候才初始化对象。对应的是饿汉模式private static Singleton singletonnew Singleton();
双检锁 第一个是指synchronized(Singleton.class){…} 之所以将锁加在这里而不是方法上是因为加在方法上的话多个线程调用这个方法都要抢锁而实际上我们只需要保证创建对象时线程安全即可。所以为了更细粒度的锁我们加在了判空前。
第二个是指锁内还写了一个判空条件。这是因为线程A和B都进入了第一个判空条件内然后这时候A加了锁开始创建创建对象。结束后B线程也会创建对象。所以就需要再加一个判空条件。
volatile singletonnew Singleton();其实分为三步1.给Singleton分配空间。2.初始化对象调用Singleton的构造方法3.将singleton这个引用指向刚分配的内存地址。
但如果指令重排按照132的顺序进行。如果2还没有执行完这时再来一个线程B发现singleton不为空了直接return singleton而我们的构造方法还没执行呢这时就会出错。
class SingletonLazy {// 使用private防止其他类使用// 使用双重检查锁 必须加上volatile 防止指令重排private volatile static SingletonLazy singletonLazy;// 私有化构造器private SingletonLazy() {};public static SingletonLazy getInstance() {// 双重检查锁if (singletonLazy null) {synchronized (SingletonLazy.class) {//双重检查锁if (singletonLazy null) {singletonLazy new SingletonLazy();}}}return singletonLazy;}
}