首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AtomicLongFieldUpdate类的实际使用和说明

AtomicLongFieldUpdate类的实际使用和说明
EN

Stack Overflow用户
提问于 2013-06-22 00:00:16
回答 5查看 1K关注 0票数 7

有没有人知道AtomicLongFieldUpdate类在实际生活中的用法?我读过描述,但我还没有完全领会它的意思。我为什么想知道这个呢?好奇心和OCPJP的准备。

提前谢谢。

EN

回答 5

Stack Overflow用户

发布于 2013-06-22 01:01:26

您可以为以下项目想出一个成本阶梯:

  • 普通long:便宜,但不安全,对于多线程访问更昂贵,对于多线程访问安全,原子操作不是最昂贵的,对于多线程访问最安全,原子操作可能

(当我说“不安全”或“不可能”时,我指的是“没有像同步这样的外部机制”。)

在需要多线程访问的情况下,但大多数操作都是简单的读或写操作,只需要几个原子操作,您可以创建一个AtomicLongFieldUpdate的静态实例,并在需要原子更新时使用它。内存/运行时开销类似于一个简单的volatile变量,除了原子操作与普通AtomicLong操作的量级(或略高于)。

这是一个nice little tutorial

票数 7
EN

Stack Overflow用户

发布于 2015-02-16 21:07:50

你使用AtomicLongFieldUpdater而不是AtomicLong的原因很简单,那就是降低堆成本。在内部,两者在compareAndSet级别上的工作方式基本相同,最终都使用sun.misc.Unsafe。

假设你有一个被初始化了1000k次的类。使用AtomicLong,您将创建1000k AtomicLongs。另一方面,使用AtomicLongFieldUpdater,您将创建1个常量AtomicLongFieldUpdater和1000k长的原语,这些原语当然不需要这么多堆空间。

票数 4
EN

Stack Overflow用户

发布于 2013-06-22 01:08:09

有没有人知道AtomicLongFieldUpdate类在实际生活中的用法?

我自己从来没有用过这个类,但在我的工作空间上使用get时,我看到了几个使用它的“现实生活”实例:

  • com.google.common.util.concurrent.AtomicDouble使用它来原子地修改其内部volatile long字段,该字段使用Number.doubleToRawLongBits(...)存储来自double的位。Pretty cool.
  • net.sf.ehcache.Element使用它自动更新hitCount字段。

我已经看过描述了,但我还没有完全掌握它的意思。

它基本上提供了与AtomicLong相同的功能,但在另一个类的本地字段上。AtomicLongFieldUpdate的内存负载比AtomicLong少,因为您为每个字段配置了一个更新实例,从而降低了内存开销,但反射带来的CPU开销更大(尽管可能很小)。

javadocs说:

这个类被设计用于原子数据结构中,在这种结构中,同一节点的几个字段独立地受到原子更新的影响。

当然可以,但是这样我就可以使用多个Atomic*字段了。我之所以使用这个类的唯一原因是,如果有一个我不能更改的现有类,我想要自动递增。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17239568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档