JMM

内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。

在C或C++中, 可以利用不同操作平台下的内存模型来编写并发程序. 但是, 这带给开发人员的是, 更高的学习成本.相比之下, Java利用了自身虚拟机的优势, 使内存模型不束缚于具体的处理器架构, 通过Java内存模型真正实现了跨平台.(针对hotspot jvm, jrockit等不同的jvm, 内存模型也会不相同)

线程操作某个对象时,执行顺序如下:
1) 从主内存复制变量到当前的工作内存 read load
2) 执行代码,改变共享变量值 use assign
3) 用工作内存数据刷新主存内容 store write

java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这三个特性来建立的。
原子性:通过read load use assign store write这六个原子性操作来保证原子性(除了long和double的基本类型都是原子性操作)
其实还有lock和unlock,它的范围更大,但虚拟机未把这两个直接开放给用户使用,而是提供了更高层次的字节码指令monitorenter和monitorexit来隐式地使用这两个操作,反映到代码中的就是synchronized代码块
可见性:可见性指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。
除了volatile,java还有两个关键字能实现可见性,synchronized和final
synchronized里面对一个变量执行unlock操作之前,会把此变量同步回主内存中(store write)。
final因为不可变,所以可见,呵呵~~,但是要注意this引用的逃逸,这样会使其他的线程通过该引用访问到"初始化了一半的对象"
有序性:java程序的有序性总结为一句话,如果在本地线程观察,所有的操作都是有序的,如果在另外一个线程观察该线程,发现所有的操作都是无序的,前半句是指(线程内表现为串行的语义 Within-Thread As-If-Serial Semantics),后半句是指"指令重排序现象和工作内存和主内存同步延迟的现象。volatile从语义上就禁止了重排序,而synchronized规定了持有同一个锁的多个同步块只能串行的进入,也能保证操作的有序性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值