volatile的浅层理解

对共享变量

对于内存可见性需要从指令的层级来理解,

就是一个线程对一个共享变量的写操作是要分好多个指令来执行的,还不是原子的,会插入这个线程中其他指令,

所以两个线程如果对同一个变量操作没加同一个锁,那么,另一个读线程读到的还是缓存数据,再用这个缓存数据更新到主存,两个线程的更新就覆盖了,出现数据不一致的问题


一种办法,就是两个线程在处理同一个变量时,竞争同一把锁,一个线程更新完了,释放了锁,这时同步到主存的所有指令都完成了,这点很关键!!!!

然后另一个线程拿到锁,再处理,就不会数据不一致了


如果变量时volatile修饰,那么只要一个线程修改了,别的线程一定会立刻得到同步,

但是这个不解决两个不加锁的线程会同时得到这个变量的值,基于这个值做计算后,都更新还是会有数据不一致的问题

所以volatile只适合一个线程更新了,另一个线程能立刻得到!单例模式里double check,一个对象创建了另一个能立马知道,另一点就是对象创建是分三个指令的,如果不加volatile就会指令重排,导致即使不是null了,但是还没调用构造函数

另一个适合的场景是glag标记位的问题,防止指令重排,同时做到内存可见,?

不解决对共享数据操作的原子性问题,需要靠锁

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容