Volatile原子性一致性JVM指令重排

概念

  • 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底层的硬件对于语言的编写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python修改文件内容,不需要read,write多个动作。

python 要修改文件内容,常用 是先read,后write , 再 rename,很不爽。 比如:需要 把 yuv_dir "../HD/" # "H:/HD_Master/1080i25/" 改为 yuv_dir "C:/HD/" # "H:…

Atomic系列类

Atomic系列类别 Atomic系列类封装了一系列的基础类型和对象操作,其主要目的就是为了实现原子性,主要核心类如下 AtomicIntegerAtomicLongAtomicBooleanAtomicIntegerArrayAtomicLongArrayAtomicReference 原子性的引用对象在对Atomic类操作的时候&…

python 系统学习笔记(十二)---os os.path os.walk

得到当前工作目录,即当前 Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir()函数用来删除一个文件:os.remove()删除多个目录:os.removedirs(r“c:\python”)检验给出的路径是否是…

Java JUC工具类--CountDownLatch

CountDownLatch:用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行 package com.example.core.juc;import java.util.concurrent.CountDownLatch;public class UseCountDownLatch {public stat…

Java JUC工具类--CyclicBarrier

CyclicBarrier:栅栏的概念,多线程的进行阻塞,等待某一个临界值条件满足后,同时执行 类比:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好&#…

人生感悟:人生像吃自助餐

问我怎样管理欲望,过简单生活?我的答案是:你要先学会品味人生,品味的同义词,就叫做体悟内涵。 人为什么有这么多欲望?其实,我们每个人在一个社会,就像进入一个自助餐(buffet)店,食物非常的多…

Java JUC工具类--Future

Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程)在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种…

职场与生活 八条原则 让你不再浪费时间和提高效率

Heidi Roizen女士一度是硅谷人人争相学习的典范。她曾创办自己的公司并管理了14年之久。后来,她担任苹果公司主管开发者关系的高级副总裁。现在,她是DFJ Venture的一位风投家,她还在斯坦福主讲一门名叫‌‌“企业家精神‌‌”的课程。她几乎认…

Java JUC工具类--Exchanger

Exchanger Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据两个线程通过exchange方法交换数据,如果一个线程先执行exchange方法,它会一直等待第二个线程也执行exchang…

爸爸的素质决定孩子飞多高,爸爸们请反复看!!!

好父亲等于200个好老师,当爹的都好好看看,以后孩子不给力别怨别人! 孩子是父亲的影子,希望每个阅读完全文的父亲,都能成为一个好父亲。 NO.1爸爸是孩子最好的老师 爸爸的素质有多高,孩子就能飞多高 用理性的父爱帮…

Java JUC工具类--ForkJoin

ForkJoin Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架Fork/Join中两个重要的类 ForkJoinTask:使用该框架,需要创建一个ForkJoin任务…

修复bug的12个关键步骤

要多少时间才能修复bug,事先是很难知道的,特别是如果你和这些代码还素不相识的话,情况就更加扑朔迷离了。James Shore在《The Art of Agile 》一书中,明确指出要想修复问题得先知道问题的所在。而我们之所以无法准确估计时间是因为…

Java JUC工具类--Master-Worker

Master-Worker Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程Master负责接收和分配任务,Worker负责处理子任务当各个Worker子进程处理完成后,会将结果返回给Master,由Ma…

身体打来的电话,你一定要接!

心脏有问题时。左边手臂会酸、麻、痛。肝脏有问题时。小腿晚上睡觉时容易抽筋。肾脏出现问题时。声音就会出不来,就会沙哑。脾胃出现问题时。偏头痛。附:五脏排毒最简单有效的方法 一、心脏有问题时 1。呼吸会不顺畅,胸口会闷也会刺痛&…

Java JUC工具类--Semaphore

Semaphore 在Semaphore信号量非常适合高并发访问限制,新系统在上线之前,要对系统的访问量进行评估,评估是经过以往的经验、数据、历年的访问量,已经推广力度进行一个合理的评估当然评估标准不能太大也不能太小,太大的…

python 基础知识点整理 和具体应用

Python教程 Python是一种简单易学,功能强大的编程语言。它包括了高效的高级数据结构和简单而有效的方法,面向对象编程。Python优雅的语法,动态类型,以及它天然的解释能力,使其成为理想的语言,脚本和应用程序…

Java 线程池相关问题

线程池的拒绝策略 AbortPolicy:直接抛出异常阻止系统正常工作。CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。DiscardOldestPolicy:丢弃最老的一个请求,尝试再次提…

对编程人员我想说:多做 多实践 多写代码

有很多人问我,怎样提高自己的能力?有初学者,有水平达到一定程度的程序员。 我想说,不要过多的看代码,看计算机理论,看别人写的文章,代码等,最重要的是自己理解了某个原理&#xff0c…

读人是基础,看人是关键,做人最重要

人生在世,读人是基础,看人是关键,做人最重要。 一、读人——一个人就是一本书。读人,比读其他文字的书更难。在生活中,每个人都是书,每人又都是读者。我们认认真真地读,读了大半辈子&#xff0c…