I'm currently reading "Java Concurrency in Practice" and I agree on these 
change. I saw you continued at 
http://svn.apache.org/viewvc?view=revision&revision=1343696, is that all?

Jacques

Jacopo Cappellato wrote:
> Hi devs,
> 
> please review my commit below because I am working to apply a similar pattern 
> to a lot of other classes in OFBiz. This effort is
> not a search-and-replace task but instead I am reviewing each individual 
> usage of static UtilCache objects and refactoring (when
> necessary) the code to follow the pattern you see below.  
> Here are some points to notice (feedback is highly appreciated because I am 
> planning to use a similar approach on several other
> classes): 1) if possible, make the static fields that hold the reference to 
> UtilCache a private and final field; I know this is
> not required but in my opinion makes the code easier to read and more secure 
> 2) when useful, use the new method
> UtilCache.putIfAbsentAndGet that always returns a value (the reference of the 
> object passed to it or the reference of the object
> found in the cache); of course this is not mandatory because I could use 
> putIfAbsent and then use the reference of the passed
> object (if the returnedvalue is null, which means that it was added to the 
> cache) but I think that putIfAbsentAndGet often makes
> the code slightly more readable 3) removed the synchronized block in favour 
> of two calls to the thread safe UtilCache object:
> "get" and "putIfAbsentAndGet" (or "putIfAbsent")    
> 
> Kind regards,
> 
> Jacopo
> 
> Begin forwarded message:
> 
>> From: jaco...@apache.org
>> Subject: svn commit: r1343277 - 
>> /ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/region/RegionManager.java
>> Date: May 28, 2012 5:02:39 PM GMT+02:00
>> To: comm...@ofbiz.apache.org
>> Reply-To: dev@ofbiz.apache.org
>> 
>> Author: jacopoc
>> Date: Mon May 28 15:02:39 2012
>> New Revision: 1343277
>> 
>> URL: http://svn.apache.org/viewvc?rev=1343277&view=rev
>> Log:
>> Improved code that manages the cache:
>> * removed unnecessary synchronization
>> * protected the UtilCache object (static field) by making it private and 
>> final
>> 
>> Modified:
>>    
>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/region/RegionManager.java
>> 
>> Modified: 
>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/region/RegionManager.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/region/RegionManager.java?rev=1343277&r1=1343276&r2=1343277&view=diff
>> ==============================================================================
>>  ---
>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/region/RegionManager.java 
>> (original) +++
>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/region/RegionManager.java 
>> Mon May 28 15:02:39 2012 @@ -38,7 +38,7 @@ public
>> class RegionManager { 
>> 
>>     public static final String module = RegionManager.class.getName();
>> 
>> -    protected static UtilCache<URL, Map<String, Region>> regionCache = 
>> UtilCache.createUtilCache("webapp.Regions.Config", 0, 0);
>> +    private static final UtilCache<URL, Map<String, Region>> regionCache = 
>> UtilCache.createUtilCache("webapp.Regions.Config",
>> 0, 0); 
>> 
>>     protected URL regionFile = null;
>> 
>> @@ -54,14 +54,8 @@ public class RegionManager {
>>     public Map<String, Region> getRegions() {
>>         Map<String, Region> regions = regionCache.get(regionFile);
>>         if (regions == null) {
>> -            synchronized (this) {
>> -                regions = regionCache.get(regionFile);
>> -                if (regions == null) {
>> -                    if (Debug.verboseOn()) Debug.logVerbose("Regions not 
>> loaded for " + regionFile + ", loading now", module);
>> -                    regions = readRegionXml(regionFile);
>> -                    regionCache.put(regionFile, regions);
>> -                }
>> -            }
>> +            if (Debug.verboseOn()) Debug.logVerbose("Regions not loaded for 
>> " + regionFile + ", loading now", module);
>> +            regions = regionCache.putIfAbsentAndGet(regionFile, 
>> readRegionXml(regionFile));
>>         }
>>         return regions;
>>     }

Reply via email to