有没有人知道AtomicLongFieldUpdate类在实际生活中的用法?我读过描述,但我还没有完全领会它的意思。我为什么想知道这个呢?好奇心和OCPJP的准备。
提前谢谢。
发布于 2013-06-22 01:01:26
您可以为以下项目想出一个成本阶梯:
long:便宜,但不安全,对于多线程访问更昂贵,对于多线程访问安全,原子操作不是最昂贵的,对于多线程访问最安全,原子操作可能(当我说“不安全”或“不可能”时,我指的是“没有像同步这样的外部机制”。)
在需要多线程访问的情况下,但大多数操作都是简单的读或写操作,只需要几个原子操作,您可以创建一个AtomicLongFieldUpdate的静态实例,并在需要原子更新时使用它。内存/运行时开销类似于一个简单的volatile变量,除了原子操作与普通AtomicLong操作的量级(或略高于)。
这是一个nice little tutorial。
发布于 2015-02-16 21:07:50
你使用AtomicLongFieldUpdater而不是AtomicLong的原因很简单,那就是降低堆成本。在内部,两者在compareAndSet级别上的工作方式基本相同,最终都使用sun.misc.Unsafe。
假设你有一个被初始化了1000k次的类。使用AtomicLong,您将创建1000k AtomicLongs。另一方面,使用AtomicLongFieldUpdater,您将创建1个常量AtomicLongFieldUpdater和1000k长的原语,这些原语当然不需要这么多堆空间。
发布于 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*字段了。我之所以使用这个类的唯一原因是,如果有一个我不能更改的现有类,我想要自动递增。
https://stackoverflow.com/questions/17239568
复制相似问题