快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
了"this"对象。

Code list 3:

public class SchemaManager {     private HashMap schema;   

  private HashMap treeNodes;     ...     public boolean 

synchronized updateSchema(HashMap nodeTree) {         String 

nodeName = (String)nodeTree.get("nodeName");         

String nodeAttributes = (List)nodeTree.get("attributes"); 

        if (nodeName == null) return false;         else return 

schema.update(nodeName,nodeAttributes);     }

public boolean synchronized updateTreeNodes() { ...... } }

  

对比Code list 2中的代码,这段代码就显得更糟糕些了,因为当调 用"updateSchema"方法时,它锁定了整个

对象,为了获得更好的粒度控制,应该仅仅锁定"schema"变量来替代锁定整个对 象,这样其他不同的方法就可

以保持并行执行了。

避免在static方法上加锁

最糟糕的状况是在static方法上加"synchronized",这样会造成锁定这个class的 所有实例对象。

-------------------------------- at sun.awt.font.NativeFontWrapper.initializeFont(Native Method) - waiting to lock <0xeae43af0> (a java.lang.Class) at java.awt.Font.initializeFont(Font.java:316) at java.awt.Font.readObject(Font.java:1185) at sun.reflect.GeneratedMethodAccessor147.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at java.io.ObjectStreamClass.invokeReadObject (ObjectStreamClass.java:838) at java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:1736) at java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1646) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274) at java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:1835) at java.io.ObjectInputStream.readSerialData (ObjectInputStream.java:1759) at java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.java:1646) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274) at java.io.ObjectInputStream.defaultReadFields (ObjectInputStream.java:1835) at java.io.ObjectInputStream.defaultReadObject (ObjectInputStream.java:452) at com.fr.report.CellElement.readObject(Unknown Source) ... ...

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

时间:2011-07-08 blogjava BlueDavy

当使用Java 2D来为报表生成字体对象时,开发人员放了一个native的static 锁在"initialize"方法上,不过这是sun JDK 1.4中才会出现的,在JDK 5.0中, 这个static lock就消失了。

在Java SE 5.0中使用lock free的数据结构

在Java中,"synchronized"关键字是一个较简单、并且相对来说比较好用的协 作机制,不过同时对于管理一个简单的操作(例如增加统计值或更新一个值)来 说就显得比较重量级了,就像以下的代码:

Code list 4:

public class OnlineNumber {    private int totalNumber;    

public synchronized int getTotalNumber() { return totalNumber; }    

public synchronized int increment() { return ++totalNumber; }    

public synchronized int decrement() { return --totalNumber; }}

以上的代码只是用来锁定非常简单的操作,"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号