java多线程为什么valotile共享变量不能替代sychronized?

synchronize

保证原子性, 用来同步线程,保证需要同一个锁的两段代码或多段代码一次只执行其中一段,当其中一段代码在执行时,其他代码所在的线程处于阻塞状态。

valotile

1、读主内存到本地副本;
2、操作本地副本;
3、回写主内存。

volatile关键字的目的是告诉虚拟机:
* 每次访问变量时,总是获取主内存的最新值;
* 每次修改变量后,立刻回写到主内存。

是保证时效性不是原子性。

为什么?

当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。这个时候,有个单线程模型下不存在的问题就来了:如果多个线程同时读写共享变量,会出现数据不一致的问题。

在Java虚拟机中,变量的值保存在主内存中,但是,当线程访问变量时,它会先获取一个副本,并保存在自己的工作内存中。如果线程修改了变量的值,虚拟机会在某个时刻把修改后的值回写到主内存,但是,这个时间是不确定的!

 

参考:https://www.liaoxuefeng.com/wiki/1252599548343744/1306580844806178

 

 

 

展开阅读全文
©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读