Java Thread系列(六)volatile

volatile 关键字具备可见性,不具备原子性。主要作用是使变量在多个线程间可见。但不具备原子性(同步性),可以算一个轻量级的 synchronized ,性能要比 synchronized 强很多,不会造成阻塞。

一、volatile 可见性

public class VolatileThread extends Thread {

    //volatile修辞的变量,变量发生变化时会强制性从主线程栈中读取该变量
private volatile boolean isRuning = true; public void setIsRuning(boolean isRuning) {
this.isRuning = isRuning;
System.out.println("变量isRuning设置成功");
} public void run () {
//主线程调制的变量isRuning生效,程序退出while语句
while (isRuning) {
// do ...
}
} public static void main(String[] args) throws InterruptedException {
VolatileThread vt = new VolatileThread();
vt.start();
Thread.sleep(1000);
//主线程调制的变量isRuning在线程vt中生效,即实现了可见性
vt.setIsRuning(false);
}
}

二、volatile 非原子性

要想保证原子性,可以用 synchronized 修辞,或使用 AtomicInteger 类

import java.util.concurrent.atomic.AtomicInteger;

public class VolatileNotAtomic extends Thread {

    private static volatile int count;
//private static AtomicInteger count = new AtomicInteger(0); public static void addCount() {
for (int i = 0; i < 1000; i++) {
count++;
//count.incrementAndGet();
}
System.out.println(count);
//使用volatile关键字,最后的结果不是1000*10
//要想保证原子性,可以使用AtomicInteger类,只保证最后的结果正确,中间可能有误
} public void run () {
addCount();
} public static void main(String[] args) throws InterruptedException {
VolatileNotAtomic[] vna = new VolatileNotAtomic[10];
for (int i = 0; i < 10; i++) {
vna[i] = new VolatileNotAtomic();
}
for (int i = 0; i < vna.length ; i++) {
vna[i].start();
}
}
}

参考:

  1. 《Java并发编程:volatile关键字解析》:http://www.importnew.com/18126.html

  2. 《volatile的适用场景》:https://blog.csdn.net/vking_wang/article/details/9982709

  3. 《正确使用 Volatile 变量》:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html


每天用心记录一点点。内容也许不重要,但习惯很重要!

最新文章

  1. Spring mvc4 + ActiveMQ 整合
  2. 安装vs2013以后,链接数据库总是报内存损坏,无法写入的错误
  3. 词频统计(WEB版)
  4. HDU1007 Quoit Design 【分治】
  5. Javascript进阶篇——浏览器对象—History对象
  6. WebLech是一个功能强大的Web站点下载与镜像工具
  7. HDU - 1241 dfs or bfs [kuangbin带你飞]专题一
  8. order by 的用法
  9. Java 容器源码分析之 Set
  10. P1547 Out of Hay
  11. 日志log4cxx 封装、实例讲解、配置文件log4cxx.properties
  12. 相似性度量 Aprioir算法
  13. Swift3 重写一个带占位符的textView
  14. MySQL的redo log结构和SQL Server的log结构对比
  15. 基于SOA的编程模型
  16. Eclipse常用快捷键之技巧篇
  17. BZOJ1064 NOI2008假面舞会
  18. NOIP模拟赛
  19. 【思路】Aizu - 1367 - Rearranging a Sequence
  20. Atitit.二维码功能的设计实践 attilax 总结

热门文章

  1. (考研)PV操作和信号量
  2. php str_replace替换特殊字符
  3. bzoj1037生日聚会
  4. 利用WeX5给手机APP增加短信验证码功能
  5. SCSI协议
  6. Entity Framework的优势和缺点
  7. struct to point
  8. Advanced Simulation Library(ASL)&amp;&amp; An adaptive and distributed-memory parallel implementation of the immersed boundary (IB) method (IBAMR)
  9. react之引用echarts
  10. ul li的添加 删除 复制 clone()