Java 多线程 -- volatile 山寨版的synchronized
2024-10-09 02:04:04
在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。
在 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 后可以看到循环结束。
最新文章
- 课前HTML基础
- 浅谈JavaScript中的Function引用类型
- Unity3D实现摄像机视野的拉远拉近和跟随主角旋转效果
- 09 Mysql数据库在Linux下的使用
- ABAP(笔记)
- Windows Phone开发(42):缓动动画
- Java集合类的详解与应用
- 为什么ArrayList、LinkedList线程不安全,Vector线程安全
- 美团小程序框架mpvue入门
- 校园电商项目3(基于SSM)——配置Maven
- 通过HTTP服务访问FTP服务器文件(配置nginx+ftp服务器)
- GO语言-基础语法:变量定义
- [APUE]进程关系(下)
- verdi bin工具
- Django框架----Ajax
- 怎样从外网访问内网Jetty?
- PCM 编码
- 【bzoj1937】 Shoi2004—Mst 最小生成树
- Logan:美团点评的开源移动端基础日志库
- pyquery详细用法