懒汉模式 是在使用的时候才会生成对象

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;}
}

此时这个类则是线程安全的,当然如果要使用单例模式,推荐使用的还是枚举方法

懒汉模式-双重同步锁机制相关推荐

  1. 单例模式(懒汉模式-双检锁、饿汉模式、静态内部类模式)-详细

    文章目录 前言 单例模式(懒汉模式-双检锁.饿汉模式.静态内部类模式)-详细 01 单例模式是什么? 02 单例模式的好处? 03 单例模式的三种模式 03::01 懒汉模式 03::01::01 问 ...

  2. 大话Linux内核中锁机制之原子操作、自旋锁【转】

    转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...

  3. iOS多线程系列之GCD栅栏(barrier)实现同步锁

    多线程编程中很容易出现资源竞争的问题,比如异步读写操作造成数据不同步.那么解决这一问题多线程编程中提供了一种同步机制叫同步锁.iOS中实现同步锁机制的方案不止一种,这里主要介绍一下强大的GCD给出的方 ...

  4. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

  5. java例7_Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)

    /*** * 懒汉模式 1 * 可以延迟加载,但线程不安全. * @author admin * */ public class TestSinleton1 { private static Test ...

  6. 创建型模式:单例模式(懒汉+饿汉+双锁校验+内部类+枚举)

    单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  7. java 同步解决不安全类_「JAVA」Java 线程不安全分析,同步锁和Lock机制,哪个解决方案更好...

    线程不安全 线程不安全的问题分析:在小朋友抢气球的案例中模拟网络延迟来将问题暴露出来:示例代码如下: public class ImplementsDemo { public static void ...

  8. java并发编程(二十六)——单例模式的双重检查锁模式为什么必须加 volatile?

    前言 本文我们从一个问题出发来进行探究关于volatile的应用. 问题:单例模式的双重检查锁模式为什么必须加 volatile? 什么是单例模式 单例模式指的是,保证一个类只有一个实例,并且提供一个 ...

  9. 单实例的写法最保险的写法应采用静态方式的预生成 ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也要谨慎,需要考证是否解决这个问题

    单实例的写法最保险的写法应采用静态方式的预生成  ,不要用双重检查的懒汉模式等,JDK1.6之后加了volatile也需要考证是否解决了这个问题 推荐写法案例一 /*以单例模式启动*/     pri ...

最新文章

  1. 对标Pytorch,清华团队推出自研AI框架“计图”
  2. CodeSite使用小结
  3. 计算机软考高级论文,【2019年软考高项论文一定要避开这些坑】- 环球网校
  4. mysql 远程连接速度慢的解决方案
  5. Effective C++ --5 实现
  6. mybatis源码学习
  7. express利用nodemailer发送邮件(163邮箱)
  8. java线程初始方法三种_Java 多线程 三种实现方式
  9. 笔记随笔1(webpack,vue-router,vuex)
  10. angular1.x 组件开发
  11. js正则看这篇就够了
  12. 使用postman模拟上传文件到springMVC的坑:the request was rejected because no multipart boundary was found...
  13. Linux服务-rsync
  14. java数据同步视频,Oracle从入门到精通 oracle数据库 全程同步视频教学 内含Oracle Java项目实战教...
  15. webSocket和http长连接短连接
  16. Neokylin基础命令
  17. 西门子博图自动定时加密程序+HMI程序,可以设定定时运行时间
  18. 多个激光雷达同时校准、定位和建图的框架
  19. sphinx(附demo)
  20. 论文阅读:Permutation Matters: Anisotropic Convolutional Layer for Learning on Point Clouds

热门文章

  1. 【005】舒曼的《梦幻曲》
  2. Viso画流程图在文本边框、矩形边框线上添加文字、写文字
  3. IOS 生成本地验证码
  4. 编译原理(龙书):第四章部分题目参考答案
  5. 【计算机组成原理】计算机系统硬件结构存储器
  6. 教师演讲竞聘通用PPT模板
  7. 新版的Mybatis-Plus使用乐观锁,MP_OPTLOCK_VERSION_ORIGINAL与新版插件的使用方法
  8. 计算机硬件故障的相关知识,计算机硬件故障【计算机硬件故障的判断与维修】...
  9. LiquiBase 管理数据库变更实践
  10. 世界经典英语广告词欣赏