Java理论与实践: 流行的原子 - 编程入门网
降低使用的锁定对象 的粒度,希望更多的锁定请求从竞争变为不竞争。从锁定转换为原子变量可以获 得相同的结果,通过切换为更细粒度的协调机制,竞争的操作就更少,从而提高 了吞吐量。
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
下面图 1 和图 2 中的图与上月那些图相似,只是为基于原子的方法多添加 了一行。这些图显示了在 8-way Ultrasparc3 和单处理器 Pentium 4 上使用不 同数量线程的随机发生的吞吐量(以每秒转数为单位)。测试中的线程数不是真 实的;这些线程所表现的竞争比通常多得多,所以它们以比实际程序中低得多的 线程数显示了 ReentrantLock 与原子变量之间的平衡。您将看到,虽然 ReentrantLock 拥有比同步更多的优点,但相对于 ReentrantLock,原子变量提 供了其他改进。(因为在每个工作单元中完成的工作很少,所以下图可能无法完 全地说明与 ReentrantLock 相比,原子变量具有哪些可伸缩性优点。) 图 1. 8-way Ultrasparc3 中同步、ReentrantLock、公平 Lock 和 AtomicLong 的基准吞吐量 图 2. 单处理器 Pentium 4 中的同步、ReentrantLock、公平 Lock 和 AtomicLong 的基准吞吐量 大多数用户都不太可能使用原子变量自己开发无阻塞算法 — 他们更可能使 用 java.util.concurrent 中提供的版本,如 ConcurrentLinkedQueue。但是万 一您想知道对比以前 JDK 中的相类似的功能,这些类的性能是如何改进的,可 以使用通过原子变量类公开的细粒度、硬件级别的并发原语。 开发人员可以直接将原子变量用作共享 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |