java 原子性 可见性 有序性】的更多相关文章

原子性 原子性是指一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 如向变量x赋值操作 x = 10 是原子性的,就不会出现赋值操作进行到一半(x的低16位赋值成功,高16位没有赋值)而被打断. 原子性的操作若涉及到变量,也意味着在操作过程中该变量不会被其他线程占有. 由java内存模型来直接保证的原子性变量操作包括read.load.use.assign.store和write,大致可认为基本数据类型的读写是具备原子性的(例外是long与double的非原子性协定). 如果…
JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据结构,则是线程独有的,被保存在线程私有的内存空间中,所以这部分数据不涉及线程安全的问题 不管是堆还是栈,他们都是保存在主内存中的 线程堆栈包含正在执行的每个方法的所有局部变量(调用堆栈上的所有方法).线程只能访问它自己的线程堆栈. 由线程创建的局部变量对于创建它的线程以外的所有其他线程是不可见的.…
Java高并发--原子性可见性有序性 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 原子性:指一个操作不可中断,一个线程一旦开始,直到执行完成都不会被其他线程干扰.换句话说原子性保证了任何时刻只有一个线程在对共享变量进行操作. 可见性:指当一个线程修改了某个共享变量的值,其他线程是否能立即知道这个修改. 有序性:一个线程观察其他线程中的指令,由于指令重排序的存在,该观察结果一般杂乱无序 原子性 AtomicInteger JDK的atomic包下提供了许多"原子…
JVM高级特性与实践(十二):高效并发时的内外存交互.三大特征(原子.可见.有序性) 与 volatile型变量特殊规则 简介: 阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力. 摩尔定律(Moore):该定律用于描述处理器晶体管数量与运行效率间的发展关系. 当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍. Moore 系统中对某一部件采用更快执行方式所能获得的系统性能改进程度,取决于这种…
原创声明:本文转载自公众号[胖滚猪学编程]​ 某日,胖滚猪写的代码导致了一个生产bug,奋战到凌晨三点依旧没有解决问题.胖滚熊一看,只用了一个volatile就解决了.并告知胖滚猪,这是并发编程导致的坑.这让胖滚猪坚定了要学好并发编程的决心..于是,开始了我们并发编程的第一课. 序幕 BUG源头之一:可见性 刚刚我们说到,CPU缓存可以提高程序性能,但缓存也是造成BUG源头之一,因为缓存可以导致可见性问题.我们先来看一段代码: private static int count = 0; publ…
可见性.原子性和有序性问题:并发编程Bug的源头 核心矛盾:CPU.IO.内存三者之间的速度差异. 为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系结构.操作系统.编译程序都做出了贡献,主要体现为: 1.CPU 增加了缓存,以均衡与内存的速度差异: 2.操作系统增加了进程.线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异: 3.编译程序优化指令执行次序,使得缓存能够得到更加合理地利用. 缓存导致的可见性问题 一个线程对共享变量的修改,另外一个线程能够立刻看到…
概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同时达到,在有些场景,部分达成也能够做到线程安全. volatile就是这样一个存在,对可见性和有序性进行保障 可见性 volatile字面意思,易变的,不稳定的,在Java中含义也是如此 想要保证可见性,就要保障一个线程对于数据的操作,能够及时的对其他线程可见 volatile会通知底层,指示这个变…
由于CPU.内存.I/O 设备的速度差异,为了合理利用 CPU 的高性能,平衡这三者的速度差异,计算机体系机构.操作系统.编译程序都做出以下处理: 1. CPU 增加了缓存,以均衡与内存的速度差异: 2. 操作系统增加了进程.线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异: 3. 编译程序优化指令执行次序,使得缓存能够得到更加合理地利用.    源头之一:缓存导致的可见性问题   在单核时代,所有的线程都是在一颗 CPU 上执行,CPU 缓存与内存的数据一致性容易解决.因…
一. 产生并发Bug的源头 可见性 缓存导致的可见性问题 原子性 线程切换带来的原子性问题 有序性 编译优化带来的有序性问题 上面讲到了 volatile 与可见性,本章再主要讲下原子性.有序性与Happens-Before规则. 二.线程切换带来的原子性问题 count += 1 这一句高级语言的语句,往往需要多条CPU执令.可以分为3步: 将count值加载到寄存器 在寄存器中对count进行+1操作 将count值写回内存 所以,我们需要在高级语言的层面上,确保一些操作是原子性操作. 三.…
如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里.换句话说,这块知识点其实对于程序员来说,是比较进阶的知识.我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及到很多的底层知识,比如若你对操作系统相关的知识一无所知的话,那去理解一些原理就会费些力气.这是我们整个专栏的第一篇文章,我说这些话的意思是如果你在中 间遇到自己没想通的问题,可以去查阅资料,也可以在评论区找我,以保证你能够跟上学习进度. 你我都知道,编写正确的并发程序是一件极困难的事情,并发程序的…