日常小结-happens-before的个人理解

11 篇文章 0 订阅

happens-before的个人理解

最近看java并发方面的资料,刚看的时候被happens-before的概念给唬住了。。在看几天有了一些粗浅体会,现在先写下啦日后在整理。

产生的原因

首先java本身有一个java内存模型的概念。在此之上有一个更加抽象的概念内存一致性模型,而在此之下有一个更加底层的概念就是编译器和处理的实现模型。这三者都有自己的定义。我只从简略的角度尝试解释一下。

  • 内存一致性模型:
    内存一致性模型算是比较理想的概念。在多线程的情况下,不同程序之间是按照顺序执行的。简单的说就是同一时刻只有一个线程可以访问内存。这样就不会出现内存一致性的问题,是理想的模型。然而这样理想的模型并不现实,因为这样做效率太低。

  • 编译器和处理器的实现模型:
    首先,从计算机硬件的角度上说。现代计算机大多有多个处理器,每个处理都带有高速缓存。很多时候处理器并不会之间和内存交互,而是通过高速缓存作为中介,从而加速处理速度。由此现代操作系统每个线程也都有自己的工作储存。他们通常是从内存中读取一部分,然后定期的写会内存。这样虽然效率比较高但是会产生一定的问题。最大的问题就是内存一致性的问题。内存一致性进而说一致性问题是一个非常广泛的问题,不仅仅在线程间共享内存和通信上,在分布式系统等等诸多方面都有广泛的应用。而java解决这个问题的关键就是依靠java自己的内存一致性协议。
    其次,在运行java语句的时候首先要经过编译器然后经过处理器执行,在这两个阶段时间上都会进行重排序从而优化处理速度。不同的编译器和处理器都会有自己的想法。虽然给编译器和处理最大的优化自由的可以提高系统的性能但是对程序员来说所写的程序就无法产生自己希望所得的结果。因此需要一些一致性的协议来解决。

-java内存模型
了解以上的概念之后。java内存模型就比较好理解了。java为每个线程提供工作区,每个工作区按照java的内存一致性协议与实际的内存进行交互。这样既可以为java程序员提供足够简介的内存可见性保证,又最大程度的给予编译器和处理器优化程序的空间。而这套内存一致性协议所提供保证,面对编译器和处理器来说就是在需要同步的地方禁止某些重排序优化选项,插入一些内存屏障,亦或是强制写入读取等等。而面向程序员的一面就是简介而有效的5条happens-before关系了。

happens-before关系

  1. 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
  2. 监视器锁规则:对一个锁的解锁,happens-before与随后对这个锁的加锁。
  3. volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读
  4. start()规则:如果线程A执行操作ThreadB.start(),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
  5. 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发送消息。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值