视频17:00的volatile问题
来源:9-5 jmm的内存可见性
慕UI3469488
2019-05-15
按老师所说的,线程1读取了主内存的volatile变量,但是还没写回去,线程2也读到此时volatile变量的域值,两个线程看到的值是一样,最后两个线程刷新回去总有个先后,那是不是意味着后一个线程工作内存的变量就失效了,此时就不能写回去主内存中,而要重新读最新的volatile变量,这样岂不是变成线程安全了?不知道自己哪里理解错了,求老师点明我一下,好纠结
写回答
1回答
-
同学好,volatile没办法约束两个线程的先后执行顺序,只能保证线程内部执行的时候,对volatile变量的操作顺序是固定的,具体可以看看
https://www.itcodemonkey.com/article/1725.html
理解内存屏障后,再来看看这个例子
如果有一个变量i = 0用volatile修饰,两个线程对其进行i++操作,如果线程1从内存中读取i=0进了缓存,然后把数据读入寄存器,之后时间片用完了,然后线程2也从内存中读取i进缓存,因为线程1还未执行写操作,内存屏障是插入在写操作之后的指令,意味着还未触发这个指令,所以缓存行是不会失效的。然后线程2执行完毕,内存中i=1,然后线程1又开始执行,然后将数据写回缓存再写回内存,结果还是1。
因此没办法保证线程安全
012019-05-16
相似问题