构建可扩展的Java EE应用(一) - 编程入门网
非常重量级(当锁被其他线程持有时,线程会去频繁尝试获取锁)的, 吞吐量会下降,并且同步锁的竞争也是很昂贵的。
幸运的是,在Java SE 5.0或以上版本,你可以在不使用native代码的情况下 使用硬件级同步语义的wait-free、lock-free的算法。几乎所有现代的处理器都 具有检测和防止其他处理器并发修改变量的基础设施。这些基础设施称为比较并 交换,或CAS。 一个CAS操作包含三个参数 -- 一个内存地址,期待的旧的值以及新的值。 如 果内存地址上的值和所期待的旧的值是同一个的话,处理器将此地址的值更新为 新的值;否则它就什么都不做,同时它会返回CAS操作前内存地址上的值。一个使 用CAS来实现同步的例子如下: Code list 5: public int increment() { int oldValue = value.getValue (); int newValue = oldValue + 1; while (value.compareAndSwap(oldValue, newValue) != oldValue) oldValue = value.getValue(); return oldValue + 1;} 首先,我们从地址上读取一个值,然后执行几步操作来产生新的值(例子中只 是做加1的操作),最后使用CAS方式来将地址中的旧值改变为新值。如果在时间 片段内地址上的值未改变,那么CAS操作将成功。如果另外的线程同时修改了地址 上的值,那么CAS操作将失败,但会检测到这个操作失败,并在while循环中进行 重试。CAS最好的原因在于它是硬件级别的实现并且非常轻量级,如果100个线程 同时执行这个increment()方法,最糟糕的情况是在 increment方法执行完毕前每 个线程最多尝试99次。 在Java SE 5.0和以上版本的java.util.concurrent.atomic包中提供了在单个 变量上lock-free和线程安全操作支持的类。这些原子变量的类都提供了比较和交 换的原语,它基于各种平台上可用的最后的native的方式实现,这个包内提供了 九种原子变量,包括:AtomicInteger;AtomicLong;AtomicReference; AtomicBoolean;array forms of atomic integer、long、reference;和atomic marked reference和stamped reference类。 使用atomic包非常容易,重写上面code list 5的代码片段: Code list 6: import java.util.concurrent.atomic.*;...private AtomicInteger value = new AtomicInteger(0);public int increment() { return value.getAndIncrement();}... 构建可扩展的Java EE应用(一)(5)时间:2011-07-08 blogjava BlueDavy几乎java.util.concurrent包中所有的类都直接或间接的采用了原子变量来替代 synchronized。像 ConcurrentLinkedQueue采用了原子变量来直接实现wait-free算法,而像 ConcurrentHashMap则采用 ReentrantLock来实现必要的锁,而ReentrantLock则是采用原子变量来维护所有 等待锁的线程队列。 在我们实验室中一个最成功的关于lock free算法的案例发生在一个金融系统 中,当将"Vector"数据结构替换为"ConcurrentHashMap"后,在我们的CMT机器(8 核)性能提升了超过3倍。 竞争条件也会导致可扩展性出现问题 太多的"synchronized"关键字会导致可扩展性出现问题。但在某些场合,缺少 "synchronized"也会导致系统无法垂直扩展。缺少"synchronized"会产生竞争场 景,在这种场景下允许两个线程同时修改共享的资源,这有可能会造成破坏共享 数据,为什么我说它会导致可扩展性出现问题呢? 来看一个实际的例子。这是一个制作业的ERP系统,当在我们最新的一台CMT服 务器(2CPU、16核、128芯)上进行性能测试时,我们发现CPU的使用率超过90%, 这非常让人惊讶,因为很少有应用能够在这款机器上扩展的这么好。但我们仅仅 兴奋了5分钟,之后我们发现平均响应时间非常的慢,同时吞吐量也降到不 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |