不用synchronized和lock,实现线程安全的单例模式
来源:互联网 发布:linux开机运行sh脚本 编辑:程序博客网 时间:2024/06/07 05:37
总结:
- 单例模式必然会被多个线程访问。多线程访问一定要注意锁的问题。
- 参考博主之前分享的转载文章《java中的锁》,有几种方式如下:
- 自旋锁
- 类锁和对象锁
- 共享锁和排它锁
- 偏向锁
- 互斥锁
- 闭锁
- 活锁
- 分段锁
- 无锁
- 无状态编程
- 线程本地存储
- volatile
- CAS
- 协程
- 不使用synchronized和lock这两种工具,但仍可以参考其他方案:
- 无状态编程:不适用
- 线程本地存储:例如lock加速性能用。不适用
- volatile:必须使用,构造wall
- CAS:可以使用,代替lock或者synchronized
- 协程:不适用
- 考虑使用volatile+CAS,例如volatile+atomicboolean
- 具体来说,需要实现类似synchronized和lock的关键区域的入口和出口的功能,入口通过BtomicBoolean shouldEnter.compareAndSet(false,true)实现,并在其中new实例,然后标记可以进入出口了即AtomicBoolean shouldLeave.set()。随后,在外层用shouldLeave.isset()判定。
- 注意,由于有入口出口以及new对象,同样有new时创建了实例退出关键区域但还没有来得及初始化的问题,volatile可以解决。
- 关键代码如下:
private static AtomicBoolean shouldEnter = new AtomicBoolean(false); private static AtomicBoolean shouldLeave = new AtomicBoolean(false); private static volatile ThreadSafeSingleton instance; private ThreadSafeSingleton() { } public static ThreadSafeSingleton getInstance() { if (instance == null) { if (shouldEnter.compareAndSet(false, true)) { instance = new ThreadSafeSingleton(); shouldLeave.set(true); } while (!shouldLeave.get()) { } } return instance; }
0 0
- 不用synchronized和lock,实现线程安全的单例模式
- java单例模式和线程安全的单列模式
- java并发编程:线程安全-线程同步-synchronized和lock
- 线程安全的单例模式的实现
- 线程安全的单例模式 的各种实现 总结
- 线程安全的单例模式的实现
- 实现单例模式的线程安全的类
- 单例模式的四种线程安全的实现
- synchronized和LOCK的实现
- 怎么实现一个线程安全的单例模式呢?
- 一种线程安全的单例模式实现
- 单例模式实现 线程安全的队列 处理
- C++实现线程安全的单例模式
- 这里实现定界加锁线程安全的单例模式
- C++线程安全的单例模式实现
- 线程安全的单例模式java实现
- C++实现线程安全的单例模式
- 线程安全单例模式几种优雅的实现
- POJ3279 c语言版
- clip属性
- Mysql行锁与表锁的区别
- 欢迎使用CSDN-markdown编辑器
- Matlab 求矩阵的中值
- 不用synchronized和lock,实现线程安全的单例模式
- 欢迎使用CSDN-markdown编辑器
- setInterval()和clearInterval()
- Ecplise SVN 配置和使用
- Leetcode_Search Insert Position
- 科大讯飞培训班20170227
- Flume 1.7 源码分析(三)程序入口
- Android 反射机制
- 如果你是程序员,这些细节会害死你一