i++操作非原子的验证代码

Posted mozq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i++操作非原子的验证代码相关的知识,希望对你有一定的参考价值。

技术图片
 1 package incre;
 2 
 3 public class Incre {
 4     public static void main(String[] args) {
 5         class Count implements Runnable {
 6             public int num;
 7             @Override
 8             public void run() {
 9                 //自增操作,非原子操作,线程不安全
10 //                for (int i = 0; i < 10000; i++) {
11 //                    num++;
12 //                }
13 
14                 //对代码进行同步,查看正确结果。
15                 synchronized (this) {
16                     for (int i = 0; i < 10000; i++) {
17                         num++;
18                     }
19                 }
20             }
21 
22             public int getNum(){
23                 return num;
24             }
25         }
26 
27         Count c = new Count();
28 
29         //创建多个线程
30         final int THREAD_COUNT = 10;
31         Thread[] threadArray = new Thread[THREAD_COUNT];
32         for(int i = 0; i < threadArray.length; i++){
33             threadArray[i] = new Thread(c);
34         }
35 
36         //启动多个线程
37         for(Thread t : threadArray){
38             t.start();
39         }
40 
41         //等待这些线程结束
42         for(Thread t : threadArray){
43             try {
44                 t.join();
45             } catch (InterruptedException e) {
46                 e.printStackTrace();
47             }
48         }
49 
50         //查看计数结果
51         System.out.println("计数结果:" + c.getNum());
52     }
53 }
i++非原子操作验证代码

 

以上是关于i++操作非原子的验证代码的主要内容,如果未能解决你的问题,请参考以下文章

i++是否原子操作?并解释为什么?

并发编程三要素:原子性,有序性,可见性

并发编程三要素:原子性,有序性,可见性

java中AtomicInteger的使用

非阻塞式的原子性操作-CAS应用及原理

使用AtomicInteger原子类代替i++线程安全操作