单例模式的双锁机制
来源:互联网 发布:mac chill翻译 编辑:程序博客网 时间:2024/06/06 03:27
单例模式作为常用的设计模式之一,创建单一对象并在程序活动中提供唯一实例。一般而言,单例模式的要求有
- 单例类只能有一个实例
- 单例类必须自己创建唯一的实例
- 单例类必须提供获取唯一实例的方法
单例模式在单线程时不会出现问题,但在多线程时会由于计算机多线程处理方式的问题产生错误。由此JAVA推荐双锁机制,在获取实例方法中加入锁,并且确保该实例的修改会立刻反应在主存中。
在参考和修改现有实现模式的基础上,构建如下实现。
双锁(Double-Check)机制
package singleton_pattern;public class SingleObject { private volatile static SingleObject instance; private final static Object lock=new Object(); //当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。<可见性> //内部静态声明一个变量锁 private SingleObject() { } //把构造函数写成私有就不能外部调用了 public static SingleObject getInstance() { if (instance==null) { synchronized (lock) { //synchronized和lock能够保证任一时刻只有一个线程执行该代码块<原子性> //将getInstance方法标记为synchronized是对类实例进行同步 //synchronized(类定义)是对类同步 //synchronized(object)减小同步的粒度 //在这里加同步锁要比将getInstance方法标记为synchronized效率要高 if (instance==null) { instance=new SingleObject(); } } } return instance; } //通过该方法获取单一的实例 public void ShowMessage() { System.out.println("Hello world!"); }}
其中涉及到几个关键词,volatile和synchronized,关于为什么要这样写,可以参照:
- Java并发编程:volatile关键字解析
- Java synchronized详解
在wiki上推荐的是“饿汉式”的实现方式,即在程序开始前就初始化该类的实例。
public class Something { private Something() {} private static class LazyHolder { private static final Something INSTANCE = new Something(); } public static Something getInstance() { return LazyHolder.INSTANCE; }}
优点是实现方式简单,而且并发时不会导致错误,缺点是生成了无用对象,不满足 lazy loading。
本文是学习之余的记录,只做分享交流使用。恳请批评指正!
0 0
- 单例模式的双锁机制
- 单例模式之双锁机制
- Java设计模式---单例模式(双锁机制的弊端)
- Java设计模式---单例模式(双锁机制的弊端)
- 学习日记 单例模式的双重锁机制
- 单例模式--双检查机制
- DCL双检测锁机制-实现单例模式的缺陷与改进
- 单例模式 (二) 延迟加载/"懒汉模式" —— 使用DCL双检查锁机制
- 单例模式,基于Java反射机制的实现
- 单件模式的控制机制
- 单例模式反射机制漏洞
- 双检的单例模式
- 单例模式的双层锁原理
- 单例模式的双层锁原理
- 设计模式 单例模式 优雅的单例模式
- 利用classloader机制创建线程安全的懒汉单例模式
- 利用双重检查加锁机制实现线程安全的单例模式
- php操作memcache的单例模式并测试其机制
- 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
- unity3d-代码控制游戏角色控制器移动
- 通过RVM安装cocoapods
- 简单几步就可以把pdf转换成excel格式
- discuz如何让一个邮箱注册多个用户名?
- 单例模式的双锁机制
- <jsp:include page="${pageContext.request.contextPath}/xxx.jsp"></jsp:include> 引起引入错误
- UNIX v6 fork()源码分析
- 把你的Centos设置成代理ip服务器
- 依赖倒置原则(DIP - Dependency Inversion Principle)
- iOS CocoaPods安装教程
- UserWarning: .python-eggs is writable by group/others and vulnerable to attack when used with get_r
- C++11实现自旋锁
- 用javascript实现多表单提交同一信息