auto commit
This commit is contained in:
parent
2c89c6a18d
commit
2329cea6f7
|
@ -854,17 +854,17 @@ Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互
|
|||
|
||||
Java 内存模型允许虚拟机将没有被 volatile 修饰的 64 位数据(long,double)的读写操作划分为两次 32 位的操作来进行,也就是说对这部分数据的操作可以不具备原子性。
|
||||
|
||||
有一个错误认识就是,int 等原子性的变量在多线程操作中不会出现线程安全问题。之前的线程不安全示例代码中,cnt 变量属于 int 类型变量,1000 个线程对它进行自增操作之后,得到的值为 997 而不是 1000。
|
||||
有一个错误认识就是,int 等原子性的变量在多线程环境中不会出现线程安全问题。前面的线程不安全示例代码中,cnt 变量属于 int 类型变量,1000 个线程对它进行自增操作之后,得到的值为 997 而不是 1000。
|
||||
|
||||
为了方便讨论,将内存间的交互操作简化为 3 个:load、assign、store。
|
||||
|
||||
下图演示了两个线程同时对 cnt 变量进行操作,load、assign、store 这三个操作不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存,T2 依然可以读入该变量的值。可以看出,这两个线程之后过后,虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 assign 这个操作具备原子性。
|
||||
下图演示了两个线程同时对 cnt 变量进行操作,load、assign、store 这一系列操作不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存,T2 依然可以读入该变量的值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。
|
||||
|
||||
<div align="center"> <img src="../pics//4e760981-a0c5-4dbf-9fbf-ce963e0629fb.png"/> </div><br>
|
||||
<div align="center"> <img src="../pics//ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png"/> </div><br>
|
||||
|
||||
AtomicInteger 能保证多个线程修改的原子性。
|
||||
|
||||
<div align="center"> <img src="../pics//6c0f4afb-20ab-49fd-837d-8144f4e38bfd.png"/> </div><br>
|
||||
<div align="center"> <img src="../pics//952afa9a-458b-44ce-bba9-463e60162945.png"/> </div><br>
|
||||
|
||||
使用 AtomicInteger 重写之前线程不安全的代码之后得到以下线程安全实现:
|
||||
|
||||
|
@ -943,7 +943,7 @@ public class AtomicSynchronizedExample {
|
|||
|
||||
可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。
|
||||
|
||||
volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性,:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。
|
||||
volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。
|
||||
|
||||
### 3. 有序性
|
||||
|
||||
|
|
BIN
pics/952afa9a-458b-44ce-bba9-463e60162945.png
Normal file
BIN
pics/952afa9a-458b-44ce-bba9-463e60162945.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png
Normal file
BIN
pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
Loading…
Reference in New Issue
Block a user