From 2329cea6f7d960837bf213af6d68bde40b733a61 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 8 Apr 2018 21:39:11 +0800 Subject: [PATCH] auto commit --- notes/Java 并发.md | 10 +++++----- pics/952afa9a-458b-44ce-bba9-463e60162945.png | Bin 0 -> 15360 bytes pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png | Bin 0 -> 12288 bytes 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 pics/952afa9a-458b-44ce-bba9-463e60162945.png create mode 100644 pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 89249b84..96d344a7 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -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 这些单个操作具备原子性。 -

+

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

+

使用 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. 有序性 diff --git a/pics/952afa9a-458b-44ce-bba9-463e60162945.png b/pics/952afa9a-458b-44ce-bba9-463e60162945.png new file mode 100644 index 0000000000000000000000000000000000000000..db93c1ac8b98a25e9db9b69d4f9d1a501e606b10 GIT binary patch literal 15360 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 literal 0 HcmV?d00001 diff --git a/pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png b/pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png new file mode 100644 index 0000000000000000000000000000000000000000..f625686748c77bdfe153384213aeedaca37421a8 GIT binary patch literal 12288 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 DOeG*c literal 0 HcmV?d00001