volatile

1.什么是volatile?
volatile是JAVA虚拟机提供的轻量级的同步机制。在前面线程安全的文章中提到了内存可见性问题。volatile就是保持了内存可见性,Java编译器对指令的优化相关

2.volatile内存可见性
volatile的可见性是多线程同步之间的一种通讯机制,在JMM中规定共享变量(实例域、静态域、数组元素)放在主内存中,非共享变量(局部变量、方法定义参数和异常处理器参数)放在每个线程自己的工作内存,每个线程在使用共享变量时会将其拷贝到自己的工作内存进行操作,但操作完成后不知道何时将其写回主内存,此时主内存的值未发生改变,其他线程嗅探到主内存的值未发生改变,导致其他线程操作了脏数据”。

3.来看一组代码案例

import java.util.Scanner;public class ThreadDemo11 {static class Counter{static int count = 0;}    public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(()->{while (Counter.count == 0){}System.out.println("循环结束");});t1.start();Thread t2 = new Thread(()->{Scanner scanner = new Scanner(System.in);System.out.println("请输入一个数字");Counter.count = scanner.nextInt();});t2.start();t1.join();t2.join();System.out.println(Counter.count);}
}

运行结果

分析代码

逻辑分析

如何修改
那就加上volatile关键字,显示的指定,让编译器不要优化了,让编译器每次都从内存中读取数据

对于加了volatile关键字的变量进行操作,JVM会向处理器发送一条Lock前缀的指令,将这个变量所在的缓存行的数据写回主内存,其他线程会嗅探在总线上的数据来检查自己的数据是否过期当发现自己的缓存行对应的内存地址被改变就会将当前线程中的变量置为无效,当线程需要对该变量进行操作时,会重新从主内存中读取变量最新的值,在进行操作,这样就实现了多线程之间的通信。

注意
volatile只能保证变量的内存可见性,不能保证变量的原子性,如果想要保证原子性则需要在count++时加上synchronized

【线程】——volatile关键字相关推荐

  1. 线程:volatile关键字

    关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volatile关键字增加了实例变量在多个线程之间的可见性.但volatile关键字最致命的缺点 ...

  2. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )

    文章目录 总结 一.指令重排序规范 二.指令重排序示例 总结 Java 并发的 333 特性 : 原子性 : 每个操作都是 不可拆分的原子操作 ; 在线程中进行 a++ 就不是原子操作 , 该操作分为 ...

  3. 【Java 并发编程】线程简介 ( 原子操作 | volatile 关键字使用场景 )

    文章目录 一.原子操作 二.volatile 关键字使用场景 一.原子操作 原子操作 : read : 从 主内存 中的线程共享变量中读取数据 ; load : 将从主内存读取到的数据 , 加载到 线 ...

  4. 【Java线程】深入理解Volatile关键字和使用

    目录 背景 volatile原理 volatile特性 可见性 有序性 原子性 使用场景 背景 理解volatile底层原理之前,首先介绍关于缓存一致性协议的知识. 背景:计算机在执行程序时,每条指令 ...

  5. java和线程相关的关键字有哪些_Java中有哪些机制来保证线程安全?synchronized关键字和volatile关键字...

    想要解决线程安全问题,首先要知道为什么会造成线程不安全? 在单线程中,我们从来没有提到个线程安全问题,线程安全问题是只出现在多线程中的一个问题.因为多线程情况下有共享数据,每个线程都共享这些数据并对这 ...

  6. volatile关键字和Java线程安全问题

    一.java中的线程安全问题 我们都知道,Java是一种夸平台的语言,因此Java这种语言在处理线程安全问题的时候,会有自己的处理机制,例如volatile关键字,synchronized关键字,并且 ...

  7. 20200428 线程安全(上)--彻底搞懂volatile关键字

    计算机在处理数据的过程中为什么会出现线程不安全的问题. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中会涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存) ...

  8. 并发底层原理:线程、资源共享、volatile 关键字

    并发底层原理:线程.资源共享.volatile 关键字 1.线程 1.1 定义任务 1.2 Thread 类 1.3 使用 Executor 1.4 从任务中产生返回值 1.6 优先级 1.7 后台线 ...

  9. 线程安全、volatile关键字、原子性、并发包、死锁、线程池

    [线程安全.volatile关键字.原子性.并发包.死锁.线程池] 内容 线程安全 synchronized关键字\Lock接口 同步代码块 同步方法 Lock锁 高并发可见性问题 volatile关 ...

最新文章

  1. 登录账号 npm_自定义npm 及问题整理
  2. DLL(MFC)通过Window消息向C#程序传递数据
  3. 查询进程并杀死该进程
  4. 解决fatal: 不是一个 git 仓库(或者任何父目录)的方法
  5. .NET 中密封类的性能优势
  6. Vue中import引入模块路径时的@符号
  7. tomcat server.xml配置详解
  8. 2012总结--第10篇--工作篇
  9. 2018-2019-1 20165320 《信息安全系统设计基础》第八周学习总结
  10. (3)图像处理-图像属性shape,size,dtype
  11. golang源码解析之chan
  12. 阿里P9专家:程序员未来职业发展路线
  13. 企业数据治理体系一文读懂
  14. 小红书去水印源码算法
  15. win10 android 传多个文件夹,win10怎么使用ROBOCOPY快速复制多个文件夹
  16. 小程序中输入框input的type属性 text、number、idcard、digit 区别
  17. 计算机微课课件评比活动总结,学校品德优质课评比活动总结
  18. Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo
  19. 一天测血压的最佳时间_一天中什么时间测量血压最准?心血管医生告诉您最佳时间...
  20. 计算机配件声卡,DIY组装电脑到底需要哪些配件 攒机网卡声卡之类的要买吗

热门文章

  1. Numpy Scalars(标量)
  2. C++语言函数重载详解和示例
  3. 摄像头安装说明_老司机告诉你马路上不同摄像头有不同作用,注意区分小心扣分...
  4. html 样式初始化,css样式初始化
  5. VMware 虚拟机优化十招
  6. 盘点下 NSX-v 中“不合理”的命名
  7. Docker学习总结(69)—— 不用 Docker 如何构建容器
  8. 阿里电商架构演变之路(一)
  9. 大型网站技术架构(三)架构核心要素
  10. android 系统内测版更新,Flyme Android 10首个内测版已推送,今天你更新了吗?