快速业务通道

Java理论与实践: 流行的原子 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
降低使用的锁定对象 的粒度,希望更多的锁定请求从竞争变为不竞争。从锁定转换为原子变量可以获 得相同的结果,通过切换为更细粒度的协调机制,竞争的操作就更少,从而提高 了吞吐量。

java.util.concurrent 中的原子变量

无论是直接的还是间接的,几乎 java.util.concurrent 包中的所有类都使 用原子变量,而不使用同步。类似 ConcurrentLinkedQueue 的类也使用原子变 量直接实现无等待算法,而类似 ConcurrentHashMap 的类使用 ReentrantLock 在需要时进行锁定。然后, ReentrantLock 使用原子变量来维护等待锁定的线 程队列。

如果没有 JDK 5.0 中的 JVM 改进,将无法构造这些类,这些改进暴露了( 向类库,而不是用户类)接口来访问硬件级的同步原语。然后, java.util.concurrent 中的原子变量类和其他类向用户类公开这些功能。

Java理论与实践: 流行的原子(4)

时间:2010-12-22 IBM Brian Goetz

使用原子变量获得更高的吞吐量

上月,我介绍了 ReentrantLock 如何相对于同步提供可伸缩性优势,以及构 造通过伪随机数生成器模拟旋转骰子的简单、高竞争示例基准。我向您显示了通 过同步、 ReentrantLock 和公平 ReentrantLock 来进行协调的实现,并显示了 结果。本月,我将向该基准添加其他实现,使用 AtomicLong 更新 PRNG 状态的 实现。

清单 5 显示了使用同步的 PRNG 实现和使用 CAS 备选实现。注意,要在循 环中执行 CAS,因为它可能会失败一次或多次才能获得成功,使用 CAS 的代码 总是这样。

清单 5. 使用同步和原子变量实现线程安全 PRNG

public class PseudoRandomUsingSynch implements PseudoRandom {    private int seed;    public PseudoRandomUsingSynch(int s) { seed = s; }    public synchronized int nextInt(int n) {      int s = seed;      seed = Util.calculateNext(seed);      return s % n;    } } public class PseudoRandomUsingAtomic implements PseudoRandom {    private final AtomicInteger seed;    public PseudoRandomUsingAtomic(int s) {      seed = new AtomicInteger(s);    }    public int nextInt(int n) {      for (;;) {        int s = seed.get();        int nexts = Util.calculateNext(s);        if (seed.compareAndSet(s, nexts))          return s % n;      }    } }

下面图 1 和图 2 中的图与上月那些图相似,只是为基于原子的方法多添加 了一行。这些图显示了在 8-way Ultrasparc3 和单处理器 Pentium 4 上使用不 同数量线程的随机发生的吞吐量(以每秒转数为单位)。测试中的线程数不是真 实的;这些线程所表现的竞争比通常多得多,所以它们以比实际程序中低得多的 线程数显示了 ReentrantLock 与原子变量之间的平衡。您将看到,虽然 ReentrantLock 拥有比同步更多的优点,但相对于 ReentrantLock,原子变量提 供了其他改进。(因为在每个工作单元中完成的工作很少,所以下图可能无法完 全地说明与 ReentrantLock 相比,原子变量具有哪些可伸缩性优点。)

图 1. 8-way Ultrasparc3 中同步、ReentrantLock、公平 Lock 和 AtomicLong 的基准吞吐量

Java理论与实践: 流行的原子 - 编程入门网

图 2. 单处理器 Pentium 4 中的同步、ReentrantLock、公平 Lock 和 AtomicLong 的基准吞吐量

Java理论与实践: 流行的原子 - 编程入门网

大多数用户都不太可能使用原子变量自己开发无阻塞算法 — 他们更可能使 用 java.util.concurrent 中提供的版本,如 ConcurrentLinkedQueue。但是万 一您想知道对比以前 JDK 中的相类似的功能,这些类的性能是如何改进的,可 以使用通过原子变量类公开的细粒度、硬件级别的并发原语。

开发人员可以直接将原子变量用作共享

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号