概念

  • Volatile概念:Volatile关键字的主要作用是使变量在多个线程间可见。
  • 作用: 在多线程间可以进行变量的变更,使得线程间进行数据的共享可见 阻止指令重排序,happens-before
package com.example.core.cas;import com.example.core.safely.UseThreadLocal;public class UseVolatile extends Thread{private volatile boolean isRunning = true;private void setRunning(boolean isRunning){this.isRunning = isRunning;}public void run(){System.out.println("进入Run方法");while(isRunning == true){//...}System.err.println("线程停止");}public static void main(String[] args) throws InterruptedException{UseVolatile uv = new UseVolatile();uv.start();Thread.sleep(2000);uv.setRunning(false);System.out.println("isRunning的值已经被设置为false");}
}
  • 一个线程可以执行的操作有使用(use)、赋值(assign)、装载(load)、存储(store)、锁定(lock)、解锁(unlock)。
  • 而主内存可以执行的操作有读(read)、写(write)、锁定(lock)、解锁(unlock),每个操作都是原子的。
  • volatile的作用就是强制线程到主内存(共享内存)里去读取变量,而不去线程工作内存区里去读取,从而实现了多个线程间的变量可见。也就是满足线程安全的可见性

JVM

  • Java Memory Model(Java 内存模型),简称JMM,并发编程这块,解决一个线程对共享变量的写入何时对另一个线程可见!
  • 比如一个线程给变量 a 赋值 int a = 3; // 向变量 a 写值 我要解决的问题就是:"在什么条件下,读取变量a的线程将看到这个值3",如果缺少同步,那会有很多因素使得读取变量a的线程不能立即看到或者永远看不到这个值3
  • 所有的变量都存储在主内存中, 每一个线程都有一个私有的本地内存,本地内存中存储了该线程使用到的变量在主内存中拷贝! 线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量(volatile变量也不例外)
  • 如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系,A=1;B=A;就是A操作的结果要对B操作可见,那么必然存在A happens-before B 简而言之:使用happens-before的概念来阐述操作之间的内存可见性
  • 例如:对一个锁的解锁,happens-before 于随后对这个锁的加锁,先后顺序很关键

指令重排

  • JAVA语言为了维持顺序内部的顺序化语义,也就是为了保证程序的最终运行结果需要和在单线程严格意义的顺序化环境下执行的结果一致,程序指令的执行顺序有可能和代码的顺序不一致,这个过程就称之为指令的重排序
  • 指令重排序的意义在于:JVM能根据处理器的特性,充分利用多级缓存,多核等进行适当的指令重排序,使程序在保证业务运行的同时,充分利用CPU的执行特点,最大的发挥机器的性能
  • volatile可以阻止指令的重排序
  • 涉及到cpu底层的硬件对于语言的编写

Volatile原子性一致性JVM指令重排相关推荐

  1. volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))

    volatile是java虚拟机提供的轻量级的同步机制: 1.保证可见性:线程之间可见性(及时通知) 2.不保证原子性 3.禁止指令重排 先了解一下jvm同步 由于JVM运行程序的实体是线程,而每个线 ...

  2. jvm指令重排原因?怎么避免?

    原因:计算机内存操作速度远慢于CPU运行速度,所以就造成CPU空置,为了将提高CPU利用率,虚拟机会按照自己的一些规则会跳过执行慢的代码,去执行快的代码(即对代码重新排序),从而提升jvm的整体性能. ...

  3. Java并发:volatile内存可见性和指令重排

    volatile两大作用 1.保证内存可见性 2.防止指令重排 此外需注意volatile并不保证操作的原子性. (一)内存可见性 1 概念 JVM内存模型:主内存和线程独立的工作内存 Java内存模 ...

  4. Java并发编程(五)JVM指令重排

    我是不是学了一门假的java...... 引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果.. ...

  5. 面试准备每日系列:计算机底层之并发编程(一)原子性、atomic、CAS、ABA、可见性、有序性、指令重排、volatile、内存屏障、缓存一致性、四核八线程

    文章目录 1. 什么是进程?什么是线程? 2. 线程切换 3. 四核八线程是什么意思 3.1 单核CPU设定多线程是否有意义 4. 并发编程的原子性 4.1 如何解决原子性问题 & atomi ...

  6. volatile指令重排_volatile可见性和指令重排

    volatile关键字的2个作用 1.线程的可见性 2.防止指令重排 什么是线程的可见性? 线程的可见性 就是一个线程对一个变量进行更改操作 其他线程获取会获得最新的值. 线程在执行的行 操作主线程的 ...

  7. Volatile禁止指令重排

    Volatile禁止指令重排 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系 ...

  8. 两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排

    1. 并发编程的可见性问题 2. 并发编程的有序性问题 3. 使用volatile关键字解决可见性问题 4. 可见性问题的本质--缓存不一致 因为cpu执行速度很快,但是内存执行速度相对于CPU很慢, ...

  9. volatile指令重排_有多少人面试栽到Volatile上?面试问题都总结到这儿了

    Volatile关键字 volatile 是Java虚拟机提供的 轻量级 的同步机制.何为 轻量级 呢,这要相对于 synchronized 来说.Volatile有如下三个特点. 要搞清楚上面列举的 ...

最新文章

  1. windows10 vs2013控制台工程中添加并编译cuda8.0文件操作步骤
  2. win10计算机无法睡眠怎么办,Windows10笔记本电脑无法睡眠怎么处理
  3. ocr数据集批量换随机背景
  4. fastDFS分布式文件系统--文件上传/下载/查询完整代码实现
  5. 廖雪峰JS教程--条件判断
  6. C++ 使用A*算法解决八数码问题
  7. 万字长文:解读区块链7类共识算法
  8. 使用.NET System.IO.Pipelines和Kestrel套接字库创建Redis客户端
  9. 2019/2/17 Python今日收获
  10. Algorithm:贪心策略之区间选点问题
  11. D. Beautiful numbers
  12. SWPU信息学院团体程序设计竞赛题解
  13. OSPF区域间路由计算规则与实验
  14. alias自定义别名
  15. ec2 web mysql_AWS之EC2实例搭建LAMP服务器
  16. 解决天正M_批打印没有天正的打印格式(TArch20V6.ctb)的问题
  17. 计算机word2003界面,Word2003工作界面简介
  18. Python关于人脸图片转换128/512维度向量的两种做法
  19. 城市快速路拥堵治理及一体化交通组织优化经验分享
  20. 外文文献翻译工具,4款可供选择!

热门文章

  1. 【转】语义化版本 2.0.0
  2. 【转】Ubuntu下使用sysv-rc-conf管理服务
  3. 【转】ABP源码分析十二:本地化
  4. Sharepoint学习笔记—ECM系列--2 管理元数据服务应用Metadata Service Application
  5. 什么是RPA 现在都有哪些产品
  6. ABP入门系列(13)——Redis缓存用起来
  7. 如何收缩超大的SharePoint_Config数据库
  8. oracle 建分区索引_Oracle分区表及分区索引-创建list分区
  9. Spark-三大数据结构之-广播变量
  10. 【HDU - 2546】饭卡 (dp,0-1背包,贪心思想)