当两个线程(线程A、线程B)操作共享数据时,共享数据存在于主存中,JVM会对线程A和线程B分配独立的内存,所以彼此的内存是不可见的,从而存在内存可见性问题。
如:线程A要对共享数据进行修改,线程B要对共享数据进行读取,当线程B执行效率高于线程A时,线程B读到的数据一直都是第一次在主存中读到的数据,无论线程B怎么修改,线程A读的数据一直都没改变(造成这种情况的原因是内存可见性问题)
解决方案:
1、加synchronized同步锁,但是效率较低,当有很多线程进行访问的时候,会出现阻塞的情况
2、用volatile关键字进行修饰,当多个线程操作共享数据时,可以保证内存的可见性问题,时一种较为轻量级的同步策略,相对于synchronized。
volatile注意事项:1、volatile不具备互斥性(如synchronized,当一个线程争到锁后,其他线程需要等待锁释放后,才能争到锁)2、volatile不能保证变量的原子性(不可在分割)