java并发知识合集(前置知识——java内存模型)

JMM规范:html

 一.概念:规范了java虚拟机与计算机内存如何协同工做,它规定了一个线程如何和什么时候能够看到其余线程修改过的共享变量的值,以及在必须时如何同步地访问共享变量。java

   备注:若是两个线程同时调用了同一个对象的同一个方法,他们都会访问这个对象的成员变量,此时这个两个线程拥有的只是这个对象的私有拷贝。编程

   如图:并发

    

  二.八种同步操做高并发

    一、luck(锁定):做用于主内存的变量,它把一个变量标示为一条线程独占的状态。线程

       二、unlock(解锁):做用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才能够被其余线程锁定。htm

       三、read(读取):做用于主内存的变量,它把一个变量的值从主内存传输到工做内存中,以便随后的load动做使用。对象

       四、load(载入):做用于工做内存的变量,它把read操做从主内存中获得的变量值放入工做内存的变量副本中。blog

       五、use(使用):做用于工做内存的变量,它把工做内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个须要使用到变量的值得字节码指令时将会执行这个操做。内存

      六、assign(赋值):做用于工做内存的变量,它把一个从执行引擎接收到的值赋给工做内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操做。

      七、store(存储):做用于工做内存的变量,它把工做内存中的一个变量的值传递到主内存中,以便随后的write操做使用。

      八、write(写入):做用于主内存的变量,它把store操做从工做内存中获得的变量值放入主内存的变量中。

  三.对应的同步规则

   一、不容许read和load、store和write单独出现。即不容许一个变量从主内存读取了但工做内存不接受,或者从工做内从发起会写了但主内存不接受的状况出现。

   二、不容许一个线程丢弃它的最近的assign操做,即变量在工做内存中改变了以后必须把该变化同步到主内存里。

   三、不容许一个线程无缘由地把数据从线程工做内存同步回主内存中,即没有发生过任何的assign操做就同步到主内存中。

   四、一个新的变量只能在主内存中诞生,不容许在工做内存中直接使用一个没有被初始化(load或assign)的变量,换句话说,就是对一个变量实施use、store操做以前,必须先执行assign和load操做。

     五、一个变量在同一时刻,只容许一个线程对其进行loack操做,但lock操做能够被同一个线程重复执行屡次,屡次执行lock后,只有执行相同次数的unloack操做,变量才能被解锁。

    六、若是对一个变量执行了lock操做,那将会清空工做内存中此变量的值,在执行引擎使用这个变量前,须要从新执行load或assign操做初始化变量的值。

    七、若是一个变量事先没有被lock操做锁定,那就不容许对他执行unlock操做,也不容许去unlock一个被其余线程锁定住的变量

    八、对一个变量执行unlock操做以前,必须先把此变量同步回主内存中(执行store、write操做)。

    四.操做与规则关系图以下:

   

 

 

注:感谢慕课网jimin老师,作这个并发集合知识总结的初衷彻底是由于看完他的《Java并发编程与高并发解决方案》产生的想法。

相关文章
相关标签/搜索