java - 一段关于Java关键字volatile的代码
问题描述
我写了一段如下代码来测试关键字 volatile 的功能。如果我运行它,线程“BBB”将永远不会跳出循环。
我可以在 MyDate 的字段编号中添加 volatile 以使其在不同线程之间可见,这可以使程序正常完成。但是如果没有 volatile 关键字,如果我在 RunnableTwo.run() 的 While 块中写一些不相关的语句,也可以使程序正常运行。那么这里到底发生了什么?
class MyData {
int number = 0;
public void changeNumber() {
this.number = 60;
}
}
class RunnableOne implements Runnable {
private MyData myData;
public RunnableOne(MyData myData) {
this.myData = myData;
}
@Override
public void run() {
{
System.out.println("Thread" + Thread.currentThread().getName() + "init with the data:" + myData.number);
try {
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}
myData.changeNumber();
System.out.println("Thread" + Thread.currentThread().getName() + "finish with the data:" + myData.number);
}
}
}
class RunnableTwo implements Runnable {
private MyData myData;
public RunnableTwo(MyData myData) {
this.myData = myData;
}
@Override
public void run() {
System.out.println("Thread" + Thread.currentThread().getName() + "init with the data:" + myData.number);
while (myData.number == 0) {
//System.out.println("wait");
}
System.out.println("Thread" + Thread.currentThread().getName() + "finish with the data:" + myData.number);
}
}
public class VolatileDemo {
public static void main(String[] args) {
MyData myData = new MyData();
new Thread(new RunnableOne(myData), "AAA").start();
new Thread(new RunnableTwo(myData), "BBB").start();
}
}
解决方案
推荐阅读
- c++ - 对从 Eigen 获得的特征值和特征向量进行排序的有效方法
- amazon-web-services - AWS Cloudformation 创建没有容器定义的任务定义
- php - 在 Mac 上安装 drush
- javascript - 由于 Regexp,Webpack 无法编译我的 javascript 文件
- reactjs - 使用 Material UI 时,borderRadius 不起作用
- python - Tensorflow:打印图形节点
- javascript - 如何在 ReactJS 的其他组件中获取变量(常量?)值?
- javascript - 如何从本地存储 JavaScript 中删除同一键的多个值中的单个选定值
- android - 如何从回收器适配器的firebase数据库中删除父级?
- gstreamer - 并排流式传输 720p 时出现 gstreamer 错误