对共享变量
对于内存可见性需要从指令的层级来理解,
就是一个线程对一个共享变量的写操作是要分好多个指令来执行的,还不是原子的,会插入这个线程中其他指令,
所以两个线程如果对同一个变量操作没加同一个锁,那么,另一个读线程读到的还是缓存数据,再用这个缓存数据更新到主存,两个线程的更新就覆盖了,出现数据不一致的问题
一种办法,就是两个线程在处理同一个变量时,竞争同一把锁,一个线程更新完了,释放了锁,这时同步到主存的所有指令都完成了,这点很关键!!!!
然后另一个线程拿到锁,再处理,就不会数据不一致了
如果变量时volatile修饰,那么只要一个线程修改了,别的线程一定会立刻得到同步,
但是这个不解决两个不加锁的线程会同时得到这个变量的值,基于这个值做计算后,都更新还是会有数据不一致的问题
所以volatile只适合一个线程更新了,另一个线程能立刻得到!单例模式里double check,一个对象创建了另一个能立马知道,另一点就是对象创建是分三个指令的,如果不加volatile就会指令重排,导致即使不是null了,但是还没调用构造函数
另一个适合的场景是glag标记位的问题,防止指令重排,同时做到内存可见,?
不解决对共享数据操作的原子性问题,需要靠锁