3. 内存系统的重排序 。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行 。
从Java源代码到最终实际执行的指令序列,会经过下面三种重排序:6.3 对于volatile型变量的特殊规则
为了保证内存的可见性,Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序 。Java内存模型把内存屏障分为LoadLoad、LoadStore、StoreLoad和StoreStore四种
当一个变量定义为volatile之后,它将具备两种特性:
- 保证此变量对所有线程的可见性,这里的可见性是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的 。普通变量的值在线程间传递需要通过主内存来完成
- 由于valatile只能保证可见性,在不符合一下两条规则的运算场景中,我们仍要通过加锁来保证原子性
- 1. 运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值 。
- 2. 变量不需要与其他的状态变量共同参与不变约束
- 禁止指令重排序,普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中执行顺序一致,这个就是所谓的线程内表现为串行的语义
Java内存模型中对volatile变量定义的特殊规则 。假定T表示一个线程,V和W分别表示两个volatile变量,那么在进行read、load、use、assign、store、write操作时需要满足如下的规则:6.4 对于long和double型变量的特殊规则
1. 只有当线程T对变量V执行的前一个动作是load的时候,线程T才能对变量V执行use动作;并且,只有当线程T对变量V执行的后一个动作是use的时候,线程T才能对变量V执行load操作 。线程T对变量V的use操作可以认为是与线程T对变量V的load和read操作相关联的,必须一起连续出现 。这条规则要求在工作内存中,每次使用变量V之前都必须先从主内存刷新最新值,用于保证能看到其它线程对变量V所作的修改后的值 。
2. 只有当线程T对变量V执行的前一个动是assign的时候,线程T才能对变量V执行store操作;并且,只有当线程T对变量V执行的后一个动作是store操作的时候,线程T才能对变量V执行assign操作 。线程T对变量V的assign操作可以认为是与线程T对变量V的store和write操作相关联的,必须一起连续出现 。这一条规则要求在工作内存中,每次修改V后都必须立即同步回主内存中,用于保证其它线程可以看到自己对变量V的修改 。
3. 假定操作A是线程T对变量V实施的use或assign动作,假定操作F是操作A相关联的load或store操作,假定操作P是与操作F相应的对变量V的read或write操作;类型地,假定动作B是线程T对变量W实施的use或assign动作,假定操作G是操作B相关联的load或store操作,假定操作Q是与操作G相应的对变量V的read或write操作 。如果A先于B,那么P先于Q 。这条规则要求valitile修改的变量不会被指令重排序优化,保证代码的执行顺序与程序的顺序相同 。
Java模型要求lock、unlock、read、load、assign、use、store、write这8个操作都具有原子性,但是对于64为的数据类型(long和double),在模型中特别定义了一条相对宽松的规定:允许虚拟机将没有被volatile修饰的64位数据的读写操作分为两次32为的操作来进行,即允许虚拟机实现选择可以不保证64位数据类型的load、store、read和write这4个操作的原子性
6.5 原子性、可见性和有序性
- 原子性:
- 即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行 。Java内存模型是通过在变量修改后将新值同步会主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性,valatile特殊规则保障新值可以立即同步到祝内存中 。Synchronized是在对一个变量执行unlock之前,必须把变量同步回主内存中(执行store、write操作) 。被final修饰的字段在构造器中一旦初始化完成,并且构造器没有吧this的引用传递出去,那在其他线程中就能看见final字段的值
- 可见性:
- 可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值 。
- 有序性:
- 即程序执行的顺序按照代码的先后顺序执行 。
这些先行发生关系无须任何同步就已经存在,如果不再此列就不能保障顺序性,虚拟机就可以对它们任意地进行重排序
- 命理解读幸福的婚姻为何出现危机
- 医药制品的批号追踪与保质期管理解决办法
- 命理解惑:求测者妻子太年轻,婚姻如何维持
- 今天和大家说一下我对于淘宝内几个流量入口的理解
- java中的关键字含义 java关键字有什么用
- 角速度定义和公式理解 角速度公式到底是如何定义的
- 不同地位的人,面对同一句爻辞该如何理解?
- Java文件读写的常用技术
- 命理解读人一生要经历的四大关卡!
- 深入分析电子结构 动态电子结构解析
