小程序容器助力企业在金融与物联网领域实现高效合规运营,带来的新机遇与挑战如何管理?
556
2023-07-14
通过volatile验证线程之间的可见性
这篇文章主要介绍了通过volatile验证线程之间的可见性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而java内存 模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副木拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:
代码验证如下:
import java.util.concurrent.TimeUnit;
class MyData{
//定义初始参数,volatile关键字使用为重点
volatile int number = 0;
//更改初始参数
public void changeNumber(){
this.number = 60;
}
}
public class VolatileDemo {
public static void main(String[] args) {
//初始化资源类
MyData myData = new MyData();
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+"初始化线程,初始参数为:"+myData.number);
//AAA线程暂停三秒后
try{
TimeUnit.SECONDS.sleep(3);
}catch(Exception e){
e.printStackTrace();
}
//AAA线程更改初始化参数为60
myData.changeNumber();
System.out.println(Thread.currentThread().getName()+"线程更改初始化参数为:"+myData.number);
},"AAA").start();
while(myData.number == 0){
//第二个线程是main线程,在number=0时则一直陷入死循环,当number=60时则打印主线程语句。
}
System.out.println(Thread.currentThread().getName()+"主线程当前参数:"+myData.number);
}
}
结果展示:
1.初始参数number未加上volatile:
2rKGeLc.初始参数number加上volatile:
总结:
volatile是JAVA虚拟机http://提供的轻量级的同步机制,volatile三大特征:保证可见性,不保证原子性,禁止指令重排。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~