首页 > 其他 > 详细

volatile 关键字 和 i++ 原子性

时间:2019-08-11 18:07:22      阅读:89      评论:0      收藏:0      [点我收藏+]
 1 package com.mozq.multithread;
 2 
 3 /**
 4  * 深入理解Java虚拟机 volatile 关键字 和 i++ 原子性。
 5  */
 6 public class VolatileTest {
 7     public static volatile int race = 0;
 8 
 9     private static final int THREADS_COUNT = 20;
10 
11     public static void main(String[] args) {
12         Thread[] threads = new Thread[THREADS_COUNT];
13         for(int i = 0; i < THREADS_COUNT; i++){
14             threads[i] = new Thread(()-> {//自增 10000 次
15                 for (int j = 0; j < 10000; j++) {
16                     race++;
17                 }
18             });
19             threads[i].start();
20         }
21         //等待所有线程执行完毕
22         for(int i = 0; i < THREADS_COUNT; i++){
23             try {
24                 threads[i].join();
25             } catch (InterruptedException e) {
26                 e.printStackTrace();
27             }
28         }
29 
30         System.out.println(race);
31     }
32     /*
33     javap -v VolatileTest.class
34     使用 javap 工具生成字节码指令信息,发现自增操作对应多条字节码指令,一条字节码至少对应一条机器指令,所以自增对应多条机器指令。
35     更严谨的说法应该验证自增操作和汇编指令间的对应关系。可以使用 PrintAssembly 工具生成对应汇编指令。
36     public static void increase();
37     descriptor: ()V
38     flags: ACC_PUBLIC, ACC_STATIC
39     Code:
40       stack=2, locals=0, args_size=0
41          0: getstatic     #2                  // Field race:I
42          3: iconst_1
43          4: iadd
44          5: putstatic     #2                  // Field race:I
45     */
46 }

 

volatile 关键字 和 i++ 原子性

原文:https://www.cnblogs.com/mozq/p/11335851.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!