1. 引言

原子(atom)本意是“不能被进一步支解的最小粒子”,而原子操纵(atomic operation)意为"不行被间断的一个或一系列操纵" 。在多处理惩罚器上实现原子操纵就变得有点 巨大。本文让我们一起来聊一聊在Intel处理惩罚器和Java里是如何实现原子操纵的。

2. 术语界说

Java原子哄骗的实现原理

3. 处理惩罚器如何实现原子操纵

32位IA-32处理惩罚器利用基于对缓存加锁或总线加锁的方法来 实现多处理惩罚器之间的原子操纵。

3.1 处理惩罚器自动担保根基内存操纵的原子性

首先处理惩罚器 会自动担保根基的内存操纵的原子性。处理惩罚器担保从系统内存傍边读取可能写入一个字节是原子的,意思 是当一个处理惩罚器读取一个字节时,其他处理惩罚器不能会见这个字节的内存地点。奔驰6和最新的处理惩罚器能自 动担保单处理惩罚器对同一个缓存行里举办16/32/64位的操纵是原子的,可是巨大的内存操纵处理惩罚器不能自动 担保其原子性,好比跨总线宽度,跨多个缓存行,跨页表的会见。可是处理惩罚器提供总线锁定缓和存锁定两 个机制来担保巨大内存操纵的原子性。

3.2 利用总线锁担保原子性

第一个机制是通过总 线锁担保原子性。假如多个处理惩罚器同时对共享变量举办读改写(i++就是经典的读改写操纵)操纵,那么 共享变量就会被多个处理惩罚器同时举办操纵,这样读改写操纵就不是原子的,操纵完之后共享变量的值会和 期望的纷歧致,举个例子:假如i=1,我们举办两次i++操纵,我们期望的功效是3,可是有大概功效是2。 如下图

Java原子哄骗的实现原理

(例1)

原因是有大概多个处理惩罚器同时从各自的缓存中读取变量i,别离 举办加一操纵,然后别离写入系统内存傍边。那么想要担保读改写共享变量的操纵是原子的,就必需担保 CPU1读改写共享变量的时候,CPU2不能操纵缓存了该共享变量内存地点的缓存。

处理惩罚器利用总线 锁就是来办理这个问题的。所谓总线锁就是利用处理惩罚器提供的一个LOCK#信号,当一个处理惩罚器在总线上输 出此信号时,其他处理惩罚器的请求将被阻塞住,那么该处理惩罚器可以独有利用共享内存。

JAVA 教程

2017-11-02


1. 引言 原子(atom)本意是不能被进一步支解的最小粒子,而原子操纵(atomic operation)意为不行被间断的一个或一系列操纵 。在多处理惩罚器上实现原子操纵就变得