在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。

在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是一个轻量级的synchronized,但是 volatile 并不能保证数据的原子性。

下面看一下加了volatile 和没有加 volatile的区别:

不加volatile:

public class VolatileTest {
private static int num = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while(num == 0) {
if(num == 1) {
System.out.println("num=" + num);
break;
}
}
}).start(); Thread.sleep(1000);
num = 1;
}
}

运行以上代码:



由于 while 循环 是一个比较底层的代码,所以一秒后,循环并没有结束。

下面给变量加上volatile 关键字测试:

public class VolatileTest {
private volatile static int num = 0;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while(num == 0) {
if(num == 1) {
System.out.println("num=" + num);
break;
}
}
}).start(); Thread.sleep(1000);
num = 1;
}
}

再运行代码:

运行代码1s 后可以看到循环结束。

最新文章

  1. 课前HTML基础
  2. 浅谈JavaScript中的Function引用类型
  3. Unity3D实现摄像机视野的拉远拉近和跟随主角旋转效果
  4. 09 Mysql数据库在Linux下的使用
  5. ABAP(笔记)
  6. Windows Phone开发(42):缓动动画
  7. Java集合类的详解与应用
  8. 为什么ArrayList、LinkedList线程不安全,Vector线程安全
  9. 美团小程序框架mpvue入门
  10. 校园电商项目3(基于SSM)——配置Maven
  11. 通过HTTP服务访问FTP服务器文件(配置nginx+ftp服务器)
  12. GO语言-基础语法:变量定义
  13. [APUE]进程关系(下)
  14. verdi bin工具
  15. Django框架----Ajax
  16. 怎样从外网访问内网Jetty?
  17. PCM 编码
  18. 【bzoj1937】 Shoi2004—Mst 最小生成树
  19. Logan:美团点评的开源移动端基础日志库
  20. pyquery详细用法

热门文章

  1. 1.用eclipse创建maven工程
  2. python—异常处理try
  3. 美国NOAA/AVHRR遥感数据
  4. Axure RP闪退问题
  5. CoderForces 327D Block Tower
  6. 从春节送祝福谈谈 IO 模型(二)
  7. 《Three.js 入门指南》0 - 说明
  8. 记录一次简单的springboot发送邮件功能
  9. jmeter术语
  10. H5 布局 -- 让容器充满屏幕高度或自适应剩余高度