码迷,mamicode.com
首页 > 编程语言 > 详细

多线程 volatile

时间:2020-05-21 21:06:23      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:volatil   排序   variable   高速缓存   mem   static   相关   https   内存   

参考:https://mp.weixin.qq.com/s/DZkGRTan2qSzJoDAx7QJag

建议阅读:《深入理解Java虚拟机》相关章节

 

多线程下的

原子性

可见性

指令重排序

无法保证(单线程 可以保证)

 

static int mainMemoryVariable=0;

 

线程1:

mainMemoryVariable++;

mainMemoryVariable--;

 

线程2:

mainMemoryVariable++;

mainMemoryVariable--;

 

1、可见性

jvm内存模型下  每个线程都有自己的工作内存(类比 计算机高速缓存);

  ①工作内存彼此不可见;

  ②线程操作共享内存(类比 计算机主内存)中变量的过程:get change set(这个set 不是即时的 所以 线程A改了共享内存某变量的值 对其他线程不是即时可见的)

2、原子性

mainMemoryVariable++;

编译成字节码 机器码  其实是多条指令

3、指令重排序(机器码 汇编代码)

mainMemoryVariable++;

编译成字节码 机器码  其实是多条指令

多条指令在执行时  顺序不一定是编译后的顺序

 

volatile 怎么保证可见性、指令重排序(JDK 1.5中):

怎么保证 指令有序-->内存屏障

一个变量被volatile修饰后

在每个volatile变量写操作、读操作的前后 加入内存屏障指令 ;

多线程 volatile

标签:volatil   排序   variable   高速缓存   mem   static   相关   https   内存   

原文地址:https://www.cnblogs.com/light-train-union/p/12933532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!