内存线程的可见性
来源:互联网 发布:淘宝店铺刷流量 编辑:程序博客网 时间:2024/06/05 16:06
可见性:
一个线程对共享变量值的修改,能够及时的被其他线程看到
共享变量:
如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量
可见性的实现方式
1.synchronized
2.volatile
synchronized
1.原子性(同步)
2.可见性
JMM关于synchronized的两条规定:
1.线程解锁前,必须把共享变量的值刷新到主内存中
2.线程加锁时,将清空工作内存中的共享变量的值,从而在使用共享变量需要从主内存中重新读取最新的值
线程执行互斥代码的过程
1.获得互斥锁
2.清空工作内存
3.从主内存拷贝变量的最新副本到工作内存
4.执行代码
5.将更改后的共享变量值刷新到主内存
6.释放互斥锁
volatile实现可见性
volatile关键字:
能保证volatile变量可见性
不能保证volatile变量符合操作的原子性
深入来说:通过加入内存屏障和禁止冲排序优化实现的
写volatile变量的过程:
1.改变线程工作内存中的volatile变量副本的值
2.将改变后的副本的值从工作内存刷新到主内存
读volatile变量的过程
1.从主内存读取vloatile变量的最新值到线程的工作内存中
2.从工作内存中读取volatile变量的副本
保持原子性的方法:
1.使用synchronized关键字
1.5后
2.使用ReentrantLock
(java.util.concurrent.locks包下)
3.使用AtomicInterger
(java.util.concurrent.atomic包下)
synchronized和volatile比较
volatile不需要加锁,比synchronized更轻量级,不会阻塞线程;
从可见性上来说,volatile中读相当于加锁,写相当于解锁
synchronized 能保证可见性,原子性
volatile 只能保证可见性
0 0
- 内存线程的可见性
- 线程 - 内存可见性
- java线程内存可见性-实现方式
- Java之多线程内存可见性_1
- 线程之间的可见性
- Synchronized的内存可见性
- 多线程的内存可见性
- java的内存可见性
- java线程内存可见性-java内存模型
- Java之多线程内存可见性_2(synchronized可见性原理)
- Java之多线程内存可见性_2(synchronized实现可见性代码)
- Java之多线程内存可见性_2(volatile实现可见性)
- 对java 内存可见性的理解
- 由Synchronized的内存可见性说起
- 实现内存可见性的方式
- JAVA多线程的内存可见性
- 对java 内存可见性的理解
- 对java 内存可见性的理解
- nodejs4.4.0安装Linux
- 从零开始学习EasyDarwin之无锁队列
- Iterator的remove()和Collection的remove()
- NavigationBar--修改返回按钮的标题
- beanutils复制javabean
- 内存线程的可见性
- 冒泡排序
- Less
- spring mvc的web.xml的配置
- iOS调用系统声音与振动
- windows下完美隐藏文件
- ios/swift 移除 childViewControllers
- sass 安装
- 16.ELK实时日志分析平台之Beats平台简介