【学习笔记】慕课网——Java多线程之内存可见性
来源:互联网 发布:linux session数量 编辑:程序博客网 时间:2024/05/21 20:00
1.Java语言层面支持的实现内存可见性的方式
synchronized
volatile
final
2.synchronized 可以实现 原子性和可见性
3.synchronized 实现可见性的代码实现过程:
1)获得互斥锁
2)清空工作内存
3)从主内存中拷贝共享变量的最新副本到工作内存
4)执行代码
5)将工作内存中更改后的共享变量的值更新到主内存
6)释放互斥锁
4.导致共享变量在内存中不可见的原因:
1)线程的交叉执行
2)线程交叉执行+重排序
3)工作内存中共享变量的值没有及时更新到主内存
5.volatile可以实现可见性,不可实现原子性
6.volatile实现可见性:
通过加入内存屏障和禁止重排序优化实现内存可见性:
1)对volatile变量执行写操作时,会在写操作后加入一条store屏障指令,将共享变量刷新到主内存
2)对volatile变量执行读操作时,会在读操作前加入一条load屏障指令,将主内存中的共享变量加载到工作内存
7.保证自增操作原子性的方法:
1)使用synchronized关键字
2)使用ReentrantLock
3)使用AtomicInteger
8.volatile适用场合
1)对变量的写入操作不依赖当前值
2)该变量没有包含在具有其他变量的不变式中
9.synchronized 和 volatile 比较
1)volatile不需要加锁,比synchronized更轻量级,不会阻塞线程
2)从内存可见性角度讲,volatile读相当于加锁,volatile写相对于解锁
3)synchronized既能保证可见性,又能保证原子性;volatile只能保证可见性,不能保证原子性。
10.对64位(long,double)变量的读写可能不是原子操作
Java内存模型允许将没有被volatile修饰的64位数据类型的读写操作划分为两次32位的读写操作进行
- 【学习笔记】慕课网——Java多线程之内存可见性
- JAVA多线程之内存可见性笔记
- Java多线程之内存可见性——synchronized
- Java多线程之内存可见性——volatile
- Java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- 浅谈java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- java多线程之内存可见性
- 细说Java多线程之内存可见性
- Java多线程之内存可见性
- Java多线程之内存可见性
- testng测试方法中的问题
- sleep()和wait()的区别——我的粗浅理解
- MMORPG外挂工作流程-----人工智能之状态机的原理和实现
- Android开发性能优化大总结
- VS 或 Qt+VS安装VLD
- 【学习笔记】慕课网——Java多线程之内存可见性
- 32-JAVA把毫秒数转换成日期
- 杭电 HDU ACM 1087 Super Jumping! Jumping! Jumping!
- shell脚本中的一些特殊符号
- 序列化的作用,应用场景,除了网路传输
- java性能优化二
- gcc - shared library vs static library
- Codeforces Round #298 (Div. 2) D. Handshakes(贪心)
- 在IDE环境中,JavaScript Validator错误 ,解决办法!