日常小结-happens-before的个人理解
2016-10-26 15:50
281 查看
happens-before的个人理解
最近看java并发方面的资料,刚看的时候被happens-before的概念给唬住了。。在看几天有了一些粗浅体会,现在先写下啦日后在整理。产生的原因
首先java本身有一个java内存模型的概念。在此之上有一个更加抽象的概念内存一致性模型,而在此之下有一个更加底层的概念就是编译器和处理的实现模型。这三者都有自己的定义。我只从简略的角度尝试解释一下。内存一致性模型:
内存一致性模型算是比较理想的概念。在多线程的情况下,不同程序之间是按照顺序执行的。简单的说就是同一时刻只有一个线程可以访问内存。这样就不会出现内存一致性的问题,是理想的模型。然而这样理想的模型并不现实,因为这样做效率太低。
编译器和处理器的实现模型:
首先,从计算机硬件的角度上说。现代计算机大多有多个处理器,每个处理都带有高速缓存。很多时候处理器并不会之间和内存交互,而是通过高速缓存作为中介,从而加速处理速度。由此现代操作系统每个线程也都有自己的工作储存。他们通常是从内存中读取一部分,然后定期的写会内存。这样虽然效率比较高但是会产生一定的问题。最大的问题就是内存一致性的问题。内存一致性进而说一致性问题是一个非常广泛的问题,不仅仅在线程间共享内存和通信上,在分布式系统等等诸多方面都有广泛的应用。而java解决这个问题的关键就是依靠java自己的内存一致性协议。
其次,在运行java语句的时候首先要经过编译器然后经过处理器执行,在这两个阶段时间上都会进行重排序从而优化处理速度。不同的编译器和处理器都会有自己的想法。虽然给编译器和处理最大的优化自由的可以提高系统的性能但是对程序员来说所写的程序就无法产生自己希望所得的结果。因此需要一些一致性的协议来解决。
-java内存模型
了解以上的概念之后。java内存模型就比较好理解了。java为每个线程提供工作区,每个工作区按照java的内存一致性协议与实际的内存进行交互。这样既可以为java程序员提供足够简介的内存可见性保证,又最大程度的给予编译器和处理器优化程序的空间。而这套内存一致性协议所提供保证,面对编译器和处理器来说就是在需要同步的地方禁止某些重排序优化选项,插入一些内存屏障,亦或是强制写入读取等等。而面向程序员的一面就是简介而有效的5条happens-before关系了。
happens-before关系
程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。监视器锁规则:对一个锁的解锁,happens-before与随后对这个锁的加锁。
volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读
start()规则:如果线程A执行操作ThreadB.start(),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
join)()规则:如果线程A执行操作ThreadB.join(),那么B线程的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
直接来看happens-before规则是都是很直观的规则。但需要注意的是任何
volatile变量的语义:
可见性:对一个volatile变量的读,总能看到任意线程对这个volatile变量最后的写入;原子性:对任意单个volatile变量的读写具有原子性,但是类似于volatile++这种复合变量的操作不具有原子性。
锁的语义:
线程A释放一个锁,实质上是线程A向接下来将要获得这个锁的某个线程发出消息线程B获取一个锁,实质上是线程B接受了之前某个线程发出的消息
线程A释放锁,随后线程B获取这个锁,这个过程实质上是线程A通过内存向线程B发送消息。
相关文章推荐
- CSS中:after和:before属性个人理解
- 并发实战——理解JVM中的Happens-Before规则(可见性,volatile)
- 深入理解Linux内核个人小结1---绪论
- :after :before 个人理解
- 深入理解Linux内核个人小结12---虚拟文件系统
- jQuery的before()方法的超简易版,用于个人理解源码以及回调函数
- Java事务的个人理解小结
- 深入理解Linux内核个人小结3--进程
- 我理解的Java并发基础(二):happens-before、可见性与原子性
- 深入理解Linux内核个人小结9---进程地址空间
- 深入理解Linux内核个人小结4---中断和异常
- 深入理解Linux内核个人小结10---系统调用
- 深入理解Linux内核个人小结2---内存寻址
- 深入理解Linux内核个人小结5---内核同步
- 关于HTTP与FTP断点下载文件个人理解小结
- happens-before通俗理解
- 个人对所学http头的理解及今日小结
- 深入理解Linux内核个人小结8---内存区管理
- 理解 happens-before
- Java多线程 -- 深入理解JMM(Java内存模型) -- happens-before俗解