快速业务通道

构建可扩展的Java EE应用(一) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
ea weblogic、IBM Websphere、开源的Glassfish和Tomcat等应用服务器,运行在 Java EE应用服务器中的应用可以立刻从CMT和SMP技术中获取到好处。

但在我的实验室中,我发现很多的产品并不能充分的使用CPU,有些应用在8 CPU的服务器上只能使用到不到20%的CPU,像这类应用即使增加CPU也提升不了多 少的。

热锁(Hot Lock)是可扩展性的关键障碍

在Java程序中,用来协调线程的最重要的工具就是 synchronized这个关键字 了。由于java所采用的规则,包括缓存刷新和失效,Java语言中的synchronized 块通常都会其他平台提供的类似的机制更加的昂贵。即使程序只是一个运行在单 处理器上的单线程程序,一个synchronized的方法调用也会比非同步的方法调用 慢。

要检查问题是否为采用synchronized关键字造成的,只需要像JVM进程发送一 个QUIT指令(译者注:在linux上也可以用kill -3 PID的方式)来获取线程堆栈 信息。如果你看到类似下面线程堆栈的信息,那么就意味着你的系统出现了热锁 的问题:

... ... ... "Thread-0" prio=10 tid=0x08222eb0 nid=0x9 waiting for monitor entry [0xf927b000..0xf927bdb8] at testthread.WaitThread.run(WaitThread.java:39) - waiting to lock <0xef63bf08> (a java.lang.Object) - locked <0xef63beb8> (a java.util.ArrayList) at java.lang.Thread.run(Thread.java:595) ... ... ...

构建可扩展的Java EE应用(一)(2)

时间:2011-07-08 blogjava BlueDavy

synchronized 关键字强制执行器串行的执行synchronized中的动作。如果很 多线程竞争同样的同步对象,那么只有一个线程能够执行同步块,而其他的线程 就只能进入blocked状态了,如果此时没有其他需要执行的线程,那么处理器就进 入空闲状态了,在这种情况下,增加CPU也带来不了多少性能提升。

热锁可能会导致更多线程的切换和系统的调用。当多个线程竞争同一个 monitor时,JVM必须维护一个竞争此monitor的线程队列(同样,这个队列也必须 同步),这也就意味着更多的时间需要花费在JVM或OS的代码执行上,而更少的时 间是用在你的程序上的。

要避免热锁现象,以下的建议能带来一些帮助:

尽可能的缩短同步块

当你将线程中持有锁的时间尽量缩短后,其他线程竞争锁的时间也就变得更短 。因此当你需要采用同步块来操作共享的变量时,应该将线程安全的代码放在同 步块的外面,来看以下代码的例子:

Code list 1:

public boolean updateSchema(HashMap nodeTree) { synchronized (schema) { String nodeName = (String)nodeTree.get("nodeName"); String nodeAttributes = (List)nodeTree.get("attributes"); if (nodeName == null) return false; else return schema.update(nodeName,nodeAttributes); } }

上面的代码片段是为了当更新"schema"变量时保护这个共享的变量。但获取 attribute值部分的代码是线程安全的。因此我们可以将这部分移至同步块的外面 ,让同步块变得更短一些:

Code list 2:

public boolean updateSchema(HashMap nodeTree) { String nodeName = (String)nodeTree.get("nodeName"); String nodeAttributes = (List)nodeTree.get("attributes"); synchronized (schema) { if (nodeName == null) return false; else return schema.update(nodeName,nodeAttributes); } }

构建可扩展的Java EE应用(一)(3)

时间:2011-07-08 blogjava BlueDavy

减小锁的粒度

当你使用"synchronized"时,有两种粒度可选择:"方法锁"或"块锁"。如果你 将"synchronized"放在方法上,那么也就意味着锁定

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号