auto commit
This commit is contained in:
@ -1027,13 +1027,13 @@ public class ThreadUnsafeExample {
|
||||
|
||||
# 十、Java 内存模型
|
||||
|
||||
Java 内存模型视图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。
|
||||
Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。
|
||||
|
||||
## 主内存与工作内存
|
||||
|
||||
处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。
|
||||
|
||||
加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致。CPU 使用一致性协议来解决一致性问题。
|
||||
加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。
|
||||
|
||||
<div align="center"> <img src="../pics//68778c1b-15ab-4826-99c0-3b4fd38cb9e9.png"/> </div><br>
|
||||
|
||||
@ -1153,7 +1153,7 @@ public class AtomicSynchronizedExample {
|
||||
|
||||
可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。
|
||||
|
||||
volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。
|
||||
volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一半的对象),那么其它线程就能看见 final 字段的值。
|
||||
|
||||
对前面的线程不安全示例中的 cnt 变量用 volatile 修饰,不能解决线程不安全问题。因为 volatile 并不能保证操作的原子性。
|
||||
|
||||
@ -1203,7 +1203,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即
|
||||
|
||||
> Thread Start Rule
|
||||
|
||||
Thread 对象的 start() 方法先行发生于此线程的每一个动作。
|
||||
Thread 对象的 start() 方法调用先行发生于此线程的每一个动作。
|
||||
|
||||
<div align="center"> <img src="../pics//thread-start-rule.png"/> </div><br>
|
||||
|
||||
@ -1276,7 +1276,7 @@ public V put(K key, V value) {
|
||||
}
|
||||
```
|
||||
|
||||
多线程环境下,应当尽量使对象称为不可变,来满足线程安全。
|
||||
多线程环境下,应当尽量使对象成为不可变,来满足线程安全。
|
||||
|
||||
### 2. 绝对线程安全
|
||||
|
||||
|
Reference in New Issue
Block a user