JAVA中Volatile和synchronized

JMM,Java Memory Model内存模型

共享变量的使用情况:
如在线程A、B的本地内存中都缓存了某个值。
当线程B使用某个共享变量时,首先会读取私有的本地内存,如果本地内存中有值则读取本地信息。
在此时如果线程A修改了值,只是替换了本地内存A中的变量,本地内存B中还是老值。
在这种情况下,线程则不安全。
规避此问题则使用Volatile和synchronized
Volatile:
JAVA中Volatile和synchronized

1、对于声明了Volatile的变量进行读写操作的时候,JMV会向处理器发送一条Lock前缀的指令。会把这个变量所在的缓存行的数据写回到系统内存中。
2、在多个处理器的情况下,保证各个处理器缓存一致性的特点,就会实现缓存一致性协议,也就是说:在变量缓存行的数据写回到系统内存后,会使该变量所在的本地内存中缓存行失效,当再去本地内存中拿数据时,发现是失效缓存行,则会去系统内存中拿取数据。
synchronized:
JAVA中Volatile和synchronized

1、使用synchronized语句块锁定一个对象或成员变量,此时等于是在该对象或成员变量上添加了分布式锁的一个monitor的监视器。
2、在使用该参数时,首先是通过monitor.Enter获得monitor监视器,如果获得成功后,则可以获得该参数,并继续使用。
3、如果失败则进入到一个synchronized queue等待之前的synchronized语句块走完后,再次进入第2步。