如何理解volatile关键字

暂时由于查了好多网络上的资料都没有具体的说明,有范围也很大没有看懂,后面如果理解有错再修改。

 1.全局共享变量非volatile:

    我是这样理解的,对于多线程中,多个线程启动时,部分先启动的线程会把全局变量拷贝一个副本到自己的线程栈,有的则是启动
还没有read load变量到自己的本地栈空间,后续先加载了变量的线程都在自己的栈空间操作变量然后再刷新到主存,如果这个操作不是原子性,比方++a或者a--,这部分线程就会出现共享问题并非线程安全,得到的结果并不是我们预先想要的。对于没有加载的变量的其它线程同样也会出现后续加载到本地内存的变量不是最新版本的,是一个失效数据(旧数据)。
   1.全局共享变量volatile:
   这个和非volatile变量区别于其它线程对共享变量的操作修改都是可见的,也就是说如果变量已经在其它线程中发生了修改,但是这个时候的最新值并没有同步
刷新到主存,即使这样后面再次加载变量的其他线程也会拿到最新的一个变量值,而不是当前线程中缓存的值。但是volatile的变量并不能保证复合型操作的原子性
所以还是会出现共享变量的安全问题,也很大可能得不到我们理想的结果。所以如果对于这种情况还是得加锁来保证其线程安全,所以才说volatile是弱的线程安全。线程安全的两个方面:1.执行控制 2.内存可见 中只能保证了内存可见,不能保证执行控制(控制代码执行(顺序)及是否可以并发执行),synchronized关键字就可以达到两个要求。

猜你喜欢

转载自blog.csdn.net/weixin_37817685/article/details/79278495