您当前的位置: 首页 > 

水的精神

暂无认证

  • 2浏览

    0关注

    711博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JMM中的happen-before原则你知道么?

水的精神 发布时间:2021-05-22 09:43:06 ,浏览量:2

 JMM又是什么?

  JMM 就是一组规则,这组规则意在解决在并发编程可能出现的线程安全问题,JMM (Java Memory Model)是 Java 内存模型,JMM 定义了程序中各个共享变量的访问规则,即在虚拟机中将变量存储到内存和从内存读取变量这样的底层细节.并提供了内置解决方案(happen-before 原则)及其外部可使用的同步手段(synchronized/volatile 等),确保了程序执行在多线程环境中的应有的 原子性,可视性及其有序性。

  JMM 规定了所有的变量都存储在主内存 规定了所有的变量都存储在主内存( (Main Memory) ) 中 。 每个线程还有自己的工作内存( 己的工作内存(Working Memory ),线程的工作内存中保存了该线程使用到的变量的 线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行 , 而不能直接读写主内存中的变量( (volatile 变量仍然有工作内存的拷贝 变量仍然有工作内存的拷贝 , 但是由于它特殊的操作顺序性规定,所以看起来如同直接在主内存中读写访问一般)。不同的线程之间也无法直接访问对方工作内存中的变量,线程之间值的传递都需要通过主内存来完成。

  综上,线程之间的通信只有两个途径,一个是:通过主内存,读取共享变量;一个是:消息传递,通过消息传递工具进行消息传递。

 

happen-before原则

  上边提到了happen-before是在JMM中用来实现并发编程中的有序性的。主要囊括了以下八个规则:

  程序顺序性原则:应该线程按照代码的顺讯执行。

  锁原则:如果一个对象已经加锁,那么后续的再对其加锁,一定发生在解锁之后。

  对象终结原则:对象的构造函数一定发生在对象终结之前。

  volatile变量规则:被volatile修改的变量写操作,Happens-Before于任意后续对这个变量操作的读

  跟线程相关的4个原则

  线程启动原则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。

  线程中断原则:线程中断发生在线程中断检查之前。

  线程的结束原则:如果线程A中执行了 ThreadB.join(),那么线程B的所有操作都发生在线程A的ThreadB.join()之后的操作。

  线程传递性原则:A happen-before B, B happen-before C ,那么A 一定 happen-before C

关注
打赏
1664074814
查看更多评论
立即登录/注册

微信扫码登录

3.9913s