AtomicReference和AtomicStampedRef
2019-07-25 本文已影响0人
a丶逍遥子
AtomicReference存在一个问题,比如当获得对象当前数据A后,在准备修改为新值B前,对象的值被其他线程连续修改A1 -> A2 -> A,发现多次修改后,对象的值又恢复为旧值A。此刻当前线程就无法准确判断这个对象究竟是否被修改过。如图所示,显示了这种情况。(图片是转载而来)
image.png
一般来说,发生这种情况的概率很小。而且即使发生了,可能也不是什么大问题。比如,我们只是简单得要做一个数值加法,即使在我取得期望值后,这个数字被不断的修改,只要它最终改回了我的期望值,我的加法计算就不会出错。也就是说,当你修改的对象没有过程的状态信息,所有的信息都只保存于对象的数值本身。
AtomicStampedReference正是这么做的。它内部不仅维护了对象值,还维护了一个时间戳(我这里把它称为时间戳,实际上它可以使任何一个整数,它使用整数来表示状态值)。当AtomicStampedReference对应的数值被修改时,除了更新数据本身外,还必须要更新时间戳。当AtomicStampedReference设置对象值时,对象值以及时间戳都必须满足期望值,写入才会成功。因此,即使对象值被反复读写,写回原值,只要时间戳发生变化,就能防止不恰当的写入。