volatile适用场景之二
2024-08-27 22:45:04
1.volatile最适用一个线程写,多个线程读的场合。
如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。(摘自Netty权威指南)
疑问:如果只是赋值的原子操作,是否可以多个线程写?(答案:可以,但是一般没有这样的必要,即没有这样的应用场景)
最经典的使用案例:
volatile boolean shutdownRequested; ... public void shutdown() { shutdownRequested = true; } public void doWork() {
while (!shutdownRequested) {
// do stuff
}
}
使用场景2:
结合使用 volatile 和 synchronized 实现 “开销较低的读-写锁”
volatile 允许多个线程执行读操作,因此当使用 volatile 保证读代码路径时,要比使用锁执行全部代码路径获得更高的共享度 —— 就像读-写操作一样。
public class CheesyCounter { private volatile int value; public int getValue() { return value; } public synchronized int increment() {
return value++;
}
}
或者
private volatile long start = System.currentTimeMillis();
public synchronized long get() {
return start++;
}
正确使用 volatile 变量的条件
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
- 对变量的写操作不依赖于当前值。
- 该变量没有包含在具有其他变量的不变式中。
更多使用场景可参考:
http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
最新文章
- Centos 7.0 安装Mono 3.4 和 Jexus 5.6
- Windows Commands and API
- 深入理解redis持久化
- android-tools-adb
- Logic BIST
- Oracle的AUTOTRACE功能
- Android开发(24)---安卓中实现多线程下载(带进度条和百分比)
- 0307-关于html
- vue 脚手架 立即可以写业务 vue + vue-router + less + axios + elementUI + moment
- Java设置接口跨域
- POJ 2154 color (polya + 欧拉优化)
- Oracle中add_months()函数的用法
- 模拟ATM的功能
- 3. Elements of a Test Plan
- 【liunx】date命令总结
- 大数据入门第十五天——HBase整合:云笔记项目
- 【Nodejs】使用http.request批量下载MP3,发现网络文件大于1000K时下载文件为0K
- 使用 ASMCMD 工具管理ASM目录及文件
- PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏
- Thunder团队第七周 - Scrum会议2