-
java在单线程的条件下,是遵循as-if-serial语义
查看全部 -
sychronzied实现可见性的过程
查看全部 -
解锁前,把共享变量的最新值刷新到主内存中;
加锁时,清空工作内存,从而使用共享变量时需要从主内存中获取最新的值。
线程解锁前对共享变量的修改,在下次加锁时对其他线程可见。
查看全部 -
synchronized和volatile比较
查看全部 -
volatile实现可见性
深入来说:通过加入内存屏障和禁止重排序优化来实现的。
对volatile变量执行写操作时,会在写操作后加入一条store屏障指令。
对volatile变量执行读操作时,会在读操作前加入一条load屏障指令。
通俗地讲:
volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存,这样任何时刻,不同的线程总能看到该变量的最新值。
线程写volatile变量的过程:
线程读volatile变量的过程:
查看全部 -
可见性分析
导致共享变量在线程间不可见的原因:
线程的交叉执行
重排序结合线程交叉执行
共享变量未及时更新
synchronized实现可见性代码:在读、写操作的方法上加上synchronized(对应上面出现问题的解决方案)
原子性
原子性
可见性
查看全部 -
synchronized实现可见性的代码
查看全部 -
java语言层面支持的可见性实现方式:
synchronized
volatile
synchronized实现可见性
JMM关于synchronized的两条规定:
线程执行互斥代码的过程:
获得互斥锁
清空工作内存
从主内存拷贝变量的最新副本到工作内存
执行代码
将更改后的共享变量的值刷新到主内存中
释放互斥锁
重排序
as-if-serial
重排序不会给单线程带来内存可见性问题
多线程中程序交错执行时,重排序可能会造成内存可见性问题。
查看全部 -
可见性
java内存模型(JMM 【java Memory Model】)描述了java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。
两条规定
共享变量可见性实现的原理
查看全部 -
volatile读写操作过程
查看全部 -
线程执行互斥代码的过程
查看全部 -
64位 long、double变量的读写可能不是原子操作
查看全部 -
volatile只能保证变量的可见性,不能保证操作的原子性,所以只适用于一些特定场合
查看全部 -
线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写,也就是说线程的与自己的工作内存交互,工作内存和主内存交互。线程与主内存不直接交互
查看全部 -
对64位变量的读写可能不是原子操作
查看全部
举报