什么是JMM模型?(未完成)
java内存模型(java memory model简称jmm) 是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规定定义
通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程都会为JVM创建一个工作内存(有些地方成为栈空间),用来存储线程私有的数据,而java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行做操,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不能的线程间无法访问对方的工作内存,线程之间的通信(传值)必须通过主内存来完成。
JMM不同于JVM内存区域模型
JMM与JVM内存区域的划分是不同的概念层次,更恰当说JMM描述的是一组规则,通过这组规则控制程序各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性,有序性,可见性展开。JMM与java内存区域唯一相似点,都存在共享区域和私有数据区域,在JMM中主内存属于共享数据区域,从某个程度上讲应该包括了堆和方法去,而工作内存数据线程私有数据区域,在JMM中主内存属于共享数据区域,从某种程度上讲应该包括了堆和方法去,而工作内存数据线成私有数据区域,从某个程度上讲泽应该包括程序计数器、虚拟机栈及本地方发栈。
主内存是由线程共享的,但是主内存不是堆。工作内存就是个抽象的东西如果在jvm里就是堆里栈里,硬件就是cpu里内存里。
比如线程a和线程b修改同一个值, 那个值就是共享变量。 他不会一直在主内存存取,他会拷贝一份到工作内存,然后线程读取工作内存中的共享变量。就算线程b中进行操作,也不会主内存直接修改,会先存在工作内存中
数据同步八大原子操作
(1)lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态
(2)unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
(3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
(4)load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
(5)use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
(6)assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
(7)store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
(8)write(写入):作用于工作内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中