懒汉模式-双重同步锁机制
懒汉模式 是在使用的时候才会生成对象
public class Singleton{private static Singleton singleton = null;//私有化构造函数,不能从外部生成private Singleton(){}public static Singleton getSingleton(){if(singleton == null){singleton = new Singleton();}return singleton; }
}
但是由于在多线程环境下,但A.B两个线程都进入 if(singleton == null),此时有可能会生成两个对象,所以是线程不安全的
网上一般的解决方案是使用双重同步锁机制,例子如下:
public class singleton{//私有构造函数private singleton{}//单例对象private static Singleton instance = null;//静态的工厂方法public static Singleton getInstance(){if(instance == null){synchronized(Singleton.class){if(instance == null){instance = new Singleton();}}}return instance;}}
虽然加了锁 和双重判断,但是其实这个类是 线程不安全的
原因是:
这个要从cpu的指令开始说起
当我们执行
instance = new Singleton(); 时 要执行什么操作呢
主要分三步
1.分配对象内存空间 memory = allocate()分配对象内存空间
2.ctorInstance()初始化对象
3.instance = memory 设置instance指向刚分配的内存
但是由于存在指令重排的情况(单线程情况下无影响。多线程下会有影响)
由于2 和3 没有顺序的必然关系
也就可能会出现
1.分配对象内存空间 memory = allocate()分配对象内存空间
3.instance = memory 设置instance指向刚分配的内存
2.ctorInstance()初始化对象
此时我们假设有两个线程A和B进入
1.A 先执行了 3.instance = memory 设置instance指向刚分配的内存这个操作,但是还未来得及初始化对象。
2.B 判断 if(instance == null) 时 则会返回true 然后instance, 这时返回值就会出现问题 。
解决方案:
此时使用volatile关键字 则可以解决这个问题 volatile 关键字 有禁止重排序的功能
public class singleton{//私有构造函数private singleton{}//单例对象private volatile static Singleton instance = null;//静态的工厂方法public static Singleton getInstance(){if(instance == null){synchronized(Singleton.class){if(instance == null){instance = new Singleton();}}}return instance;}
}
此时这个类则是线程安全的,当然如果要使用单例模式,推荐使用的还是枚举方法
懒汉模式-双重同步锁机制相关推荐
- 单例模式(懒汉模式-双检锁、饿汉模式、静态内部类模式)-详细
文章目录 前言 单例模式(懒汉模式-双检锁.饿汉模式.静态内部类模式)-详细 01 单例模式是什么? 02 单例模式的好处? 03 单例模式的三种模式 03::01 懒汉模式 03::01::01 问 ...
- 大话Linux内核中锁机制之原子操作、自旋锁【转】
转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...
- iOS多线程系列之GCD栅栏(barrier)实现同步锁
多线程编程中很容易出现资源竞争的问题,比如异步读写操作造成数据不同步.那么解决这一问题多线程编程中提供了一种同步机制叫同步锁.iOS中实现同步锁机制的方案不止一种,这里主要介绍一下强大的GCD给出的方 ...
- C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)
C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...
- java例7_Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)
/*** * 懒汉模式 1 * 可以延迟加载,但线程不安全. * @author admin * */ public class TestSinleton1 { private static Test ...
- 创建型模式:单例模式(懒汉+饿汉+双锁校验+内部类+枚举)
单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...
- java 同步解决不安全类_「JAVA」Java 线程不安全分析,同步锁和Lock机制,哪个解决方案更好...
线程不安全 线程不安全的问题分析:在小朋友抢气球的案例中模拟网络延迟来将问题暴露出来:示例代码如下: public class ImplementsDemo { public static void ...
- java并发编程(二十六)——单例模式的双重检查锁模式为什么必须加 volatile?
前言 本文我们从一个问题出发来进行探究关于volatile的应用. 问题:单例模式的双重检查锁模式为什么必须加 volatile? 什么是单例模式 单例模式指的是,保证一个类只有一个实例,并且提供一个 ...
- 单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也要谨慎,需要考证是否解决这个问题
单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也需要考证是否解决了这个问题 推荐写法案例一 /*以单例模式启动*/ pri ...
最新文章
- 对标Pytorch,清华团队推出自研AI框架“计图”
- CodeSite使用小结
- 计算机软考高级论文,【2019年软考高项论文一定要避开这些坑】- 环球网校
- mysql 远程连接速度慢的解决方案
- Effective C++ --5 实现
- mybatis源码学习
- express利用nodemailer发送邮件(163邮箱)
- java线程初始方法三种_Java 多线程 三种实现方式
- 笔记随笔1(webpack,vue-router,vuex)
- angular1.x 组件开发
- js正则看这篇就够了
- 使用postman模拟上传文件到springMVC的坑:the request was rejected because no multipart boundary was found...
- Linux服务-rsync
- java数据同步视频,Oracle从入门到精通 oracle数据库 全程同步视频教学 内含Oracle Java项目实战教...
- webSocket和http长连接短连接
- Neokylin基础命令
- 西门子博图自动定时加密程序+HMI程序,可以设定定时运行时间
- 多个激光雷达同时校准、定位和建图的框架
- sphinx(附demo)
- 论文阅读:Permutation Matters: Anisotropic Convolutional Layer for Learning on Point Clouds