由于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-验证线程之间的可见性相关推荐

  1. 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...

    线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...

  2. java volatile内存屏障_volatile 和 内存屏障

    接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题. 内存 ...

  3. java 并发线程_Java并发教程–线程之间的可见性

    java 并发线程 当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单 ...

  4. 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据

    1.概述 转载:https://www.pdai.tech/md/java/thread/java-thread-x-juc-tool-exchanger.html 视频参考:https://www. ...

  5. Java集合类ArrayList线程不安全验证和解决

    1.ArrayList 线程不安全验证 验证Demo: /*** 集合类ArrayList线程不安全验证** @author wangjie* @version V1.0* @date 2019/12 ...

  6. Java并发教程–线程之间的可见性

    当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单线程程序中的结果,但 ...

  7. java高并发(六)线程安全性

    定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 线程安全性 ...

  8. 一道非常棘手的 Java 面试题:i++ 是线程安全的吗

    转载自  一道非常棘手的 Java 面试题:i++ 是线程安全的吗 i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑 ...

  9. Java并发编程与技术内幕:线程池深入理解

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要: 本文主要讲了Java当中的线程池的使用方法.注意事项及其实现源码实现原理,并辅以实例加 ...

最新文章

  1. 用Python实现坦克大战游戏 | 干货贴
  2. javascript之原型
  3. 关于BP神经网络的大牛的论述
  4. 百度:病种类贴吧全面停止商业合作
  5. 不平等博弈问题学习记录(三)(对于超实数在博弈下左大右小以及多堆情况的扩充)
  6. AI+AR如何提升花椒直播的体验?
  7. Android——Fragment介绍
  8. 实现RTP协议的H.264视频传输系统
  9. Linux7/Redhat7/Centos7 安装Oracle 12C_系统安装_01
  10. jquery 图像滑块_如何使用jQuery构建图像滑块
  11. 阿里云CentOS-7.2安装mysql
  12. python js返回 json_如何使用 Python 得到网页返回正确的 Json 数据
  13. Linux从某个字符串处换行,Windows和Linux中任意字符串替换成换行符的问题
  14. Python脚本可在Microsoft Excel中格式化数据
  15. 单机环境下(双机或是分布式系统不用考虑这个问题),app_offline.htm是个不错的选择...
  16. 打开unity卡在loading白屏界面
  17. 多商户订餐系统php,PHP网上订餐系统V3.7(带微信功能)支持多店铺可绑定微信公众号...
  18. 【k8s】kubernetes编写自己的operator(operator-sdk:v1.xxx)
  19. 电脑蓝牙突然无法使用,解决办法来了
  20. 什么是软件验收测试?验收测试的标准和流程介绍

热门文章

  1. 深入浅出设计模式原则之开闭原则(OCP)
  2. SLAM中有关占据栅格地图的的表示方法和利用激光传感器构建占据栅格地图的方法
  3. SQLI_LAB——Less7~15
  4. rdlc 分页操作和分页统计
  5. PowerShell自动删除过期数据
  6. python程序把文件编码转换
  7. 基于Html5的移动端开发框架的研究
  8. java,list遍历赋值
  9. PHP is_null,empty以及isset,unset的区别
  10. ELK+Kafka 企业日志收集平台(一)