构建可扩展的Java EE应用(一) - 编程入门网
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的方式)来获取线程堆栈 信息。如果你看到类似下面线程堆栈的信息,那么就意味着你的系统出现了热锁 的问题:
构建可扩展的Java EE应用(一)(2)时间:2011-07-08 blogjava BlueDavysynchronized 关键字强制执行器串行的执行synchronized中的动作。如果很 多线程竞争同样的同步对象,那么只有一个线程能够执行同步块,而其他的线程 就只能进入blocked状态了,如果此时没有其他需要执行的线程,那么处理器就进 入空闲状态了,在这种情况下,增加CPU也带来不了多少性能提升。 热锁可能会导致更多线程的切换和系统的调用。当多个线程竞争同一个 monitor时,JVM必须维护一个竞争此monitor的线程队列(同样,这个队列也必须 同步),这也就意味着更多的时间需要花费在JVM或OS的代码执行上,而更少的时 间是用在你的程序上的。 要避免热锁现象,以下的建议能带来一些帮助: 尽可能的缩短同步块 当你将线程中持有锁的时间尽量缩短后,其他线程竞争锁的时间也就变得更短 。因此当你需要采用同步块来操作共享的变量时,应该将线程安全的代码放在同 步块的外面,来看以下代码的例子: Code list 1:
上面的代码片段是为了当更新"schema"变量时保护这个共享的变量。但获取 attribute值部分的代码是线程安全的。因此我们可以将这部分移至同步块的外面 ,让同步块变得更短一些: Code list 2:
构建可扩展的Java EE应用(一)(3)时间:2011-07-08 blogjava BlueDavy减小锁的粒度 当你使用"synchronized"时,有两种粒度可选择:"方法锁"或"块锁"。如果你 将"synchronized"放在方法上,那么也就意味着锁定 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |