为了方便自己学习整理的
(1)锁:作用于主存中的变量,将变量标记为一个线程独占
(2)(解锁):作用于主存中的变量,释放处于锁定状态的变量,只有此时释放的变量才能被其他线程锁定
(3)读:作用于主存中的变量,将一个变量值从主存传送到线程的工作内存中,以供后续加载动作使用。
(4) 加载:作用于工作内存中的变量。 它将读操作从主存获取的变量值放入工作内存的变量副本中。
(5)use:作用于工作内存中的变量,将工作内存中的变量值传递给执行引擎
(6)(赋值):作用于工作内存中的变量。 它将从执行引擎接收到的值分配给工作内存中的变量。
(7)store(存储):作用于工作内存中的变量,将工作内存中变量的值传输到主内存中,以供后续的写操作
(8) 写入:作用于工作内存中的变量。 它将存储操作从工作内存中的变量值传输到主内存中的变量。
如果要将一个变量从主内存复制到工作内存,则需要依次执行读取和加载操作。 如果要将一个变量从工作内存同步到主内存,需要依次执行存储和写入操作。 但Java内存模型只要求上述操作必须按顺序执行,并不能保证它们必须连续执行。
对应如下流程图:
同步规则分析:
1)不允许线程无故从工作内存同步数据到主内存(没有发生操作)
2)新的变量只能在主存中诞生,未初始化(加载或)的变量不允许在工作内存中直接使用。 也就是说,在对变量进行使用和存储操作之前,必须先对其进行加载操作。
3)一个变量只允许一个线程同时对其执行锁定操作,但同一线程可以多次执行锁定操作。 多次执行锁定后,只有执行相同次数的操作才会解锁该变量。 锁并且必须成对出现。
4) 如果对某个变量进行锁定操作,则该变量在工作内存中的值将被清除。 在执行引擎可以使用这个变量之前,需要重新执行加载或操作来初始化该变量的值。
5) 如果变量没有事先被锁定操作锁定,则不允许对其进行操作; 也不允许访问被其他线程锁定的变量。
6)对变量进行操作之前,必须将变量同步到主存(进行存储和写入操作)