Java内存模型基本简介


Java的内存模型,也就是JVM所设置的内存模型。Java内存模型分为主存储器和工作存储器,这里的存储器与计算机硬件所讲的不一样。

主存储器,就是实例位置所在的区域,所有的实例都存在主存储器内,并且实例的字段也位于这里。主存储器为所有的线程所共享。

工作存储器,它是各个线程所拥有的独立专门的作业区。在工作存储器中,存在有主存储器中必要的拷贝,称为工作拷贝。

每个线程都位于各自的工作存储器中,每个线程都不能直接的对存储器中字段进行引用或者赋值操作。

当线程欲引用字段的值时候,会一次将值从主存储器拷贝到工作存储器中,然后再引用该工作拷贝的字段。当同一个线程再次引用同一个字段的值时候,可能会引用刚才的工作拷贝,也可能会重新从主存储器拷贝到工作存储器。

当线程欲将值指定给字段的时候,会一次将值指定给位于工作存储器上的工作拷贝。指定完后,工作拷贝的内容则会映射到主存储器中。至于什么时候映射,是都JVM决定的。当同一个线程多次对于同一个字段指定的时候,线程可能只会对工作拷贝进行指定,也有可能会每次指定后,马上拷贝到主存储器中。

Java中同步包括:线程的同步和内存的同步。

线程的同步指的就是利用synchronized设置一个临界区,使得只有同时一个线程在该临界区执行。由synchronized所指定的临界区,来控制线程的操作。

欲进入synchronized时候,线程的工作存储器如果有未映射到主存储器的工作拷贝,该内容就会被强制写入主存储器,并且会将工作存储器的工作拷贝全部丢弃清除掉。

欲退出synchronized时候,线程会将工作存储器中未映射到主存储器的工作拷贝强制写入主存储器中。但是并不会清除或丢弃自己的工作存储器。

在synchronized中,不管是方法还是代码块,内存的同步仅仅会在线程“欲进入”与“欲退出”synchronized时候进行内存同步。如果是“在synchronized内部”或“正在synchronized外部”,不一定会有内存的同步。

对于关键字Volatile,它仅仅是进行内存的同步,并不会涉及线程的同步。当线程欲引用volatile字段的值,就会从主存储器中拷贝到工作存储器里。对于指定给volatile字段后,工作存储器的内容都会立刻马上映射到主存储器中。

记住:凡是多个线程所共享的对象,会对对象的状态进行修改等操作的时候,一般由synchronized或volatile来保护

注意:这篇主要是对于内存模型进行了最最基本的介绍,仅供一点点参考而已。

相关内容