java volatile线程可见_volatile-验证线程之间的可见性
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存 模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副木拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:
代码验证如下:
importjava.util.concurrent.TimeUnit;classMyData{//定义初始参数,volatile关键字使用为重点
volatile int number = 0;//更改初始参数
public voidchangeNumber(){this.number = 60;
}
}public classVolatileDemo {public static voidmain(String[] args) {//初始化资源类
MyData myData = newMyData();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:
2.初始参数number加上volatile:
总结:
volatile是JAVA虚拟机提供的轻量级的同步机制,volatile三大特征:保证可见性,不保证原子性,禁止指令重排。
java volatile线程可见_volatile-验证线程之间的可见性相关推荐
- 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...
线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...
- java volatile内存屏障_volatile 和 内存屏障
接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题. 内存 ...
- java 并发线程_Java并发教程–线程之间的可见性
java 并发线程 当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单 ...
- 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据
1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...
- Java集合类ArrayList线程不安全验证和解决
1.ArrayList 线程不安全验证 验证Demo: /*** 集合类ArrayList线程不安全验证** @author wangjie* @version V1.0* @date 2019/12 ...
- Java并发教程–线程之间的可见性
当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单线程程序中的结果,但 ...
- java高并发(六)线程安全性
定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 线程安全性 ...
- 一道非常棘手的 Java 面试题:i++ 是线程安全的吗
转载自 一道非常棘手的 Java 面试题:i++ 是线程安全的吗 i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑 ...
- Java并发编程与技术内幕:线程池深入理解
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加 ...
最新文章
- 用Python实现坦克大战游戏 | 干货贴
- javascript之原型
- 关于BP神经网络的大牛的论述
- 百度:病种类贴吧全面停止商业合作
- 不平等博弈问题学习记录(三)(对于超实数在博弈下左大右小以及多堆情况的扩充)
- AI+AR如何提升花椒直播的体验?
- Android——Fragment介绍
- 实现RTP协议的H.264视频传输系统
- Linux7/Redhat7/Centos7 安装Oracle 12C_系统安装_01
- jquery 图像滑块_如何使用jQuery构建图像滑块
- 阿里云CentOS-7.2安装mysql
- python js返回 json_如何使用 Python 得到网页返回正确的 Json 数据
- Linux从某个字符串处换行,Windows和Linux中任意字符串替换成换行符的问题
- Python脚本可在Microsoft Excel中格式化数据
- 单机环境下(双机或是分布式系统不用考虑这个问题),app_offline.htm是个不错的选择...
- 打开unity卡在loading白屏界面
- 多商户订餐系统php,PHP网上订餐系统V3.7(带微信功能)支持多店铺可绑定微信公众号...
- 【k8s】kubernetes编写自己的operator(operator-sdk:v1.xxx)
- 电脑蓝牙突然无法使用,解决办法来了
- 什么是软件验收测试?验收测试的标准和流程介绍