JVM内存和线程数据同步
Java的内存模型可以和多级存储机制(寄存器、高级缓存cache、RAM、ROM)类比。
JVM的内存分为主存和工作内存
主内存由所有线程共享,所有变量都存储在主存中,
工作内存主要包括两部分:1.某线程私有的栈;2.拷贝的主存中的某些变量。
每条线程都有自己的工作内存,提高了线程执行时的读取数据的速度
线程对变量的所有操作都必须在工作内存中进行,不能直接读写主存中的变量,线程间变量的传递需要借助主存来获得工作内存的变量值。
线程对内存(两部分:主存和工作内存)的操作有:
1.读取Read:经read操作,从主存读取的变量到线程的工作内存;
2..加载load:读取主存中的变量放到工作内存中的变量副本中;
3.锁定Lock:把主存中的变量标志为某一线程独占的状态;
4.使用use:把工作内存中的变量传递给执行引擎;
5.赋值assign:把一个执行引擎接收到的变量值赋值给工作内存的变量;
6.存储store:把工作内存中的一个变量传送到主存。
7.写入write:把store操作从工作内存中得到的变量的值放入主内存的变量中;
8.解锁:释放主存中被锁定的变量,以被其他线程锁定;
由上可知:将变量从柱墩读取到工作内存,必须顺序执行read、load操作;
将变量从工作内存同步写回主存,必须顺序执行store、write操作;
变量在工作内存中被更改后,必须同步到主存中。
Java引入的工作内存,提高了线程执行时的读取数据的速度,但是可能造成由于数据不能同步而发生脏读。而Volatile关键字可以保证每个线程得到的值都是主存中最新的变量值,即保证了可见性,但是并不能直接保证数据的同步性,还要借助对变量加一个互斥锁即lock操作来实现数据正确同步。