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

最新文章

  1. Centos 7.0 安装Mono 3.4 和 Jexus 5.6
  2. Windows Commands and API
  3. 深入理解redis持久化
  4. android-tools-adb
  5. Logic BIST
  6. Oracle的AUTOTRACE功能
  7. Android开发(24)---安卓中实现多线程下载(带进度条和百分比)
  8. 0307-关于html
  9. vue 脚手架 立即可以写业务 vue + vue-router + less + axios + elementUI + moment
  10. Java设置接口跨域
  11. POJ 2154 color (polya + 欧拉优化)
  12. Oracle中add_months()函数的用法
  13. 模拟ATM的功能
  14. 3. Elements of a Test Plan
  15. 【liunx】date命令总结
  16. 大数据入门第十五天——HBase整合:云笔记项目
  17. 【Nodejs】使用http.request批量下载MP3,发现网络文件大于1000K时下载文件为0K
  18. 使用 ASMCMD 工具管理ASM目录及文件
  19. PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏
  20. Thunder团队第七周 - Scrum会议2

热门文章

  1. python xml文件解析
  2. redis列表操作基本命令
  3. git安装及基本用法
  4. effective java——31用实例域代替序数
  5. HDU5616 天平能否称出物体重量问题 01背包变形或者折半搜索
  6. 前端修炼の道 | <div> 标签简介
  7. 【未解决】对于使用Windows的IDEA进行编译的文件,但无法在Linux系统中统计代码行数的疑问
  8. 外网ssh内网Linux服务器holer实现
  9. 关于Redis缓存数据库
  10. disjoint set