java虚拟机 (10)

假定动作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相应的 对变量W的read或write动作。如果A先于B,那么P先于Q。这条规则要求volatile修饰的变量不会被指令重排序优化,从而保证代码的执行顺序与程序的顺序 相同。

针对long和double型变量的特殊规则

许虚拟机将没有 被volat ile修饰的64位数据的读写操作划分为两次32位的操作来进行,即允许虚拟机实现自行选择是否要保证64位数据类型的load、store、read和write这四个操作的原子性,这就是所谓的“long和double的非原子性协定”

原子性、可见性与有序性 原子性

Java内存模型来直接保证原子性变量操作包括read、load、assign、use、store、write这六个,大致认为基本数据类型的访问、读写都是具备原子性例外就是long和double的非原子性协定,但几乎不会发生

可见性

除了volatile之外,Java还有两个关键字能实现可见性,它们是synchronize和final。

有序性

Java语言提供了volat ile和synchroniz ed两个关键字来保证线程之间操作的有序性,volatile关键字本 身就包含了禁止指令重排序的语义,而synchronized则是由“一个变量在同一个时刻只允许一条线程对 其进行lock操作”这条规则获得的,这个规则决定了持有同一个锁的两个同步块只能串行地进入。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgdz.html