From: jprocter Date: Fri, 19 Jun 2009 10:09:19 +0000 (+0000) Subject: more efficient synchronized methods X-Git-Tag: Release_2_5~245 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=b7953b98215afa094872196a7469a80c7964a70d;p=jalview.git more efficient synchronized methods --- diff --git a/src/jalview/io/vamsas/DatastoreRegistry.java b/src/jalview/io/vamsas/DatastoreRegistry.java index 21083dd..b58c90b 100644 --- a/src/jalview/io/vamsas/DatastoreRegistry.java +++ b/src/jalview/io/vamsas/DatastoreRegistry.java @@ -51,55 +51,54 @@ public class DatastoreRegistry if (obj instanceof DatastoreItem) { log.debug("Returning DatastoreItem self reference.");// TODO: we could - // store the update - // hierarchy - so - // retrieve parent - // for obj. + // store the update + // hierarchy - so + // retrieve parent + // for obj. return (DatastoreItem) obj; } return (DatastoreItem) dsObjReg.get(obj); } - public void registerDsObj(DatastoreItem dsitem) + synchronized void registerDsObj(DatastoreItem dsitem) { - synchronized (dsItemReg) + Object[] dsregitem = (Object[]) dsItemReg.get(dsitem); + if (dsregitem == null) { - Object[] dsregitem = (Object[]) dsItemReg.get(dsitem); - if (dsregitem == null) + // create a new item entry + dsregitem = new Object[] + { dsitem.jvobj, dsitem.vobj }; + dsItemReg.put(dsitem, dsregitem); + dsObjReg.put(dsitem.jvobj, dsitem); + dsObjReg.put(dsitem.vobj, dsitem); + } + else + { + // update registry for any changed references + // for the jvobject + if (dsitem.jvobj != dsregitem[0]) { - // create a new item entry - dsregitem = new Object[] - { dsitem.jvobj, dsitem.vobj }; - dsItemReg.put(dsitem, dsregitem); + // overwrite existing involved entries. + if (dsregitem[0] != null) + { + dsObjReg.remove(dsregitem[0]); + } + if ((dsregitem[0] = dsitem.jvobj) != null) + { + dsObjReg.put(dsregitem[0], dsitem); + } } - // atomic update of the jv and vobject references in the dsObjReg - synchronized (dsObjReg) + // and for the vobject + if (dsitem.vobj != dsregitem[1]) { - // for the jvobject - if (dsitem.jvobj != dsregitem[0]) + // overwrite existing involved entries. + if (dsregitem[1] != null) { - // overwrite existing involved entries. - if (dsregitem[0] != null) - { - dsObjReg.remove(dsregitem[0]); - } - if ((dsregitem[0] = dsitem.jvobj) != null) - { - dsObjReg.put(dsregitem[0], dsitem); - } + dsObjReg.remove(dsregitem[1]); } - // and for the vobject - if (dsitem.vobj != dsregitem[1]) + if ((dsregitem[1] = dsitem.vobj) != null) { - // overwrite existing involved entries. - if (dsregitem[1] != null) - { - dsObjReg.remove(dsregitem[1]); - } - if ((dsregitem[1] = dsitem.vobj) != null) - { - dsObjReg.put(dsregitem[1], dsitem); - } + dsObjReg.put(dsregitem[1], dsitem); } } } @@ -112,12 +111,12 @@ public class DatastoreRegistry * @return null or last known Object[] { jvobject, vobject } references for * this dsitem */ - public Object[] removeDsObj(DatastoreItem dsitem) + public synchronized Object[] removeDsObj(DatastoreItem dsitem) { Object[] dsregitem = null; - synchronized (dsItemReg) + // synchronized (dsItemReg) { - synchronized (dsObjReg) + // synchronized (dsObjReg) { dsregitem = (Object[]) dsItemReg.remove(dsitem); if (dsregitem != null) @@ -152,7 +151,7 @@ public class DatastoreRegistry items = null; dsObjReg.clear(); } - if (dsItemReg!=null) + if (dsItemReg != null) { dsItemReg.clear(); }