面试必问的volatile,你了解多少

发布网友 发布时间:2022-04-22 15:31

我来回答

1个回答

热心网友 时间:2022-07-12 23:26

我全部了解,并且可以给你全部讲懂。

volatile关键字的意思是易变的,告诉线程在读取变量的值时,不能使用线程的本地缓存值,必须取最新的。

这个理解起来容易,但关键还是要用的恰当。

有人将其用于变量的并发和原子读写,一测试发现问题来了,好像不怎么管用,无奈之下,不得不结合同步关键字实现。

并发读写的实现其实有两个关节:

一是原子读写。
如,a=5。一定能够确保5被赋值给a。

二是数据一致性。这个看上去好理解,其实有点难。
如,a=a+5,包含两步操作,先是读取a的值,再加上5赋值给a。如果在执行第二步的时候a的值被其他线程改变,那么你的赋值就没有意义,就是脏数据。而这个包含多步操作的一致性正是volatile关键字无法做到的。

所以当你要同步的变量包含条件读写,或者涉及多步操作的同步,就不要用volatile。
而仅包含一步操作的同步就可用volatile了,这个比同步关键字效率高。

例如java线程池实现中的异常处理handler就使用的volatile,因为这handler,在整个线程池类只是被赋值或者执行,不做为其他状态和数据的条件,就是典型的一步同步。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com