diff --git a/docs/notes/Java 并发.md b/docs/notes/Java 并发.md index 9f17a443..9c5b951b 100644 --- a/docs/notes/Java 并发.md +++ b/docs/notes/Java 并发.md @@ -1089,7 +1089,7 @@ Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异, Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。 -

+

- read:把一个变量的值从主内存传输到工作内存中 - load:在 read 之后执行,把 read 得到的值放入工作内存的变量副本中 @@ -1112,11 +1112,11 @@ Java 内存模型保证了 read、load、use、assign、store、write、lock 和 下图演示了两个线程同时对 cnt 进行操作,load、assign、store 这一系列操作整体上看不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存,T2 依然可以读入旧值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。 -

+

AtomicInteger 能保证多个线程修改的原子性。 -

+

使用 AtomicInteger 重写之前线程不安全的代码之后得到以下线程安全实现: @@ -1224,7 +1224,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 在一个线程内,在程序前面的操作先行发生于后面的操作。 -

+

### 2. 管程锁定规则 @@ -1232,7 +1232,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。 -

+

### 3. volatile 变量规则 @@ -1240,7 +1240,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作。 -

+

### 4. 线程启动规则 @@ -1248,7 +1248,8 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 Thread 对象的 start() 方法调用先行发生于此线程的每一个动作。 -

+

+ ### 5. 线程加入规则 @@ -1256,7 +1257,8 @@ Thread 对象的 start() 方法调用先行发生于此线程的每一个动作 Thread 对象的结束先行发生于 join() 方法返回。 -

+

+ ### 6. 线程中断规则 @@ -1474,7 +1476,7 @@ public class ThreadLocalExample1 { 它所对应的底层结构图为: -

+

每个 Thread 都有一个 ThreadLocal.ThreadLocalMap 对象。 diff --git a/docs/pics/2f1c9839-d582-4f75-863e-8f0a2ac63fb8_200.png b/docs/pics/2f1c9839-d582-4f75-863e-8f0a2ac63fb8_200.png new file mode 100644 index 00000000..a4b20378 Binary files /dev/null and b/docs/pics/2f1c9839-d582-4f75-863e-8f0a2ac63fb8_200.png differ diff --git a/docs/pics/4dc11e5e-c1d8-4391-be73-337cda32e155_200.png b/docs/pics/4dc11e5e-c1d8-4391-be73-337cda32e155_200.png new file mode 100644 index 00000000..a5bd2b22 Binary files /dev/null and b/docs/pics/4dc11e5e-c1d8-4391-be73-337cda32e155_200.png differ diff --git a/docs/pics/693426e6-b057-46a8-bfda-2cf681952756_200.png b/docs/pics/693426e6-b057-46a8-bfda-2cf681952756_200.png new file mode 100644 index 00000000..0cb973f3 Binary files /dev/null and b/docs/pics/693426e6-b057-46a8-bfda-2cf681952756_200.png differ diff --git a/docs/pics/89a0024a-7485-4164-bc82-ebdea51f59e0_200.png b/docs/pics/89a0024a-7485-4164-bc82-ebdea51f59e0_200.png new file mode 100644 index 00000000..11319054 Binary files /dev/null and b/docs/pics/89a0024a-7485-4164-bc82-ebdea51f59e0_200.png differ diff --git a/docs/pics/cb80b6f8-85bc-442c-979c-63f109311d1f_200.png b/docs/pics/cb80b6f8-85bc-442c-979c-63f109311d1f_200.png new file mode 100644 index 00000000..e9e08037 Binary files /dev/null and b/docs/pics/cb80b6f8-85bc-442c-979c-63f109311d1f_200.png differ diff --git a/docs/pics/cc1acfb8-c507-4194-b16a-33388bd1cf82_200.png b/docs/pics/cc1acfb8-c507-4194-b16a-33388bd1cf82_200.png new file mode 100644 index 00000000..8e016408 Binary files /dev/null and b/docs/pics/cc1acfb8-c507-4194-b16a-33388bd1cf82_200.png differ diff --git a/docs/pics/e2d2d90f-95eb-4877-9d36-99d7b93695de_200.png b/docs/pics/e2d2d90f-95eb-4877-9d36-99d7b93695de_200.png new file mode 100644 index 00000000..a7c1778d Binary files /dev/null and b/docs/pics/e2d2d90f-95eb-4877-9d36-99d7b93695de_200.png differ diff --git a/docs/pics/e49b6fe9-5ad7-4fe9-975d-dceb10ffe5b4_200.png b/docs/pics/e49b6fe9-5ad7-4fe9-975d-dceb10ffe5b4_200.png new file mode 100644 index 00000000..dc4aa6cc Binary files /dev/null and b/docs/pics/e49b6fe9-5ad7-4fe9-975d-dceb10ffe5b4_200.png differ diff --git a/docs/pics/e8454537-5a0c-49a2-8304-abae0b8887e1_200.png b/docs/pics/e8454537-5a0c-49a2-8304-abae0b8887e1_200.png new file mode 100644 index 00000000..89ce5c64 Binary files /dev/null and b/docs/pics/e8454537-5a0c-49a2-8304-abae0b8887e1_200.png differ