auto commit

This commit is contained in:
CyC2018 2018-04-08 21:39:11 +08:00
parent 2c89c6a18d
commit 2329cea6f7
3 changed files with 5 additions and 5 deletions

View File

@ -854,17 +854,17 @@ Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互
Java 内存模型允许虚拟机将没有被 volatile 修饰的 64 位数据longdouble的读写操作划分为两次 32 位的操作来进行,也就是说对这部分数据的操作可以不具备原子性。 Java 内存模型允许虚拟机将没有被 volatile 修饰的 64 位数据longdouble的读写操作划分为两次 32 位的操作来进行,也就是说对这部分数据的操作可以不具备原子性。
有一个错误认识就是int 等原子性的变量在多线程操作中不会出现线程安全问题。之前的线程不安全示例代码中cnt 变量属于 int 类型变量1000 个线程对它进行自增操作之后,得到的值为 997 而不是 1000。 有一个错误认识就是int 等原子性的变量在多线程环境中不会出现线程安全问题。前面的线程不安全示例代码中cnt 变量属于 int 类型变量1000 个线程对它进行自增操作之后,得到的值为 997 而不是 1000。
为了方便讨论,将内存间的交互操作简化为 3 个load、assign、store。 为了方便讨论,将内存间的交互操作简化为 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 能保证多个线程修改的原子性。 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 重写之前线程不安全的代码之后得到以下线程安全实现: 使用 AtomicInteger 重写之前线程不安全的代码之后得到以下线程安全实现:
@ -943,7 +943,7 @@ public class AtomicSynchronizedExample {
可见性指当一个线程修改了共享变量的值其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。 可见性指当一个线程修改了共享变量的值其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。
volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。 volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。
### 3. 有序性 ### 3. 有序性

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB