如何执行双重原子读取?

Posted

技术标签:

【中文标题】如何执行双重原子读取?【英文标题】:how to perform atomic read for double? 【发布时间】:2014-07-14 03:09:06 【问题描述】:

为什么没有可用于 double 的 Interlocked.Read 函数,因为有可用于 double 的 Interlocked.Exchange 和 Interlocked.CompareExchange 方法,它们可以原子地执行更复杂的功能。使用此类方法以原子方式读取双精度值(而不是使用 Interlocked.Read)将增加简单读取操作的开销。

您能否建议一种更简单的方法来原子读取双精度,因为另一个线程正在使用 Interlocked.Exchange 方法更新此双精度。

【问题讨论】:

如果“另一个线程正在更新这个双精度”,您希望检索什么值?旧值还是新值? @MitchWheat,在当前线程的读操作执行之前,其他线程的更新操作不应该被阻塞吗? 想读取新值。 @Tony:发帖人似乎在快速要求一些东西。重读时我不知道他们在问什么! --> "...会给简单的读取操作增加开销" - 是的,锁定涉及开销... @MitchWheat 对问题的混淆感到抱歉。我的意思是与 Interlocked.Read 操作相比的开销。我正在创建一个临时变量并使用 Interlocked.Exchange 以原子方式读取双精度并返回临时值。一个简单的 Interlocked.Read 似乎比 Interlocked.Exchange 方法简单得多。有什么想法吗? 【参考方案1】:

Interlocked.Readlong is implemented like this:

return Interlocked.CompareExchange(ref location,0,0);

这意味着使用CompareExchange 而不是Read 不会增加开销,longdouble 都不会。

【讨论】:

以上是关于如何执行双重原子读取?的主要内容,如果未能解决你的问题,请参考以下文章

原子变量的对齐

并发编程三要素:原子性,有序性,可见性

Java并发编程原子性与易变性

Java 并发编程线程简介 ( 原子操作 | volatile 关键字使用场景 )

JMM与并发三大特性

JMM与并发三大特性