RFR 8029891 : Deadlock detected in java/lang/ClassLoader/deadlock/GetResource.java

Peter Levart peter.levart at gmail.com
Tue May 12 21:26:13 UTC 2015

On 05/12/2015 10:49 PM, Mandy Chung wrote:
>> But I think it should be pretty safe to make the java.util.Properties 
>> object override all Hashtable methods and delegate to internal CMH so 
>> that:
>> - all modification methods + all bulk read methods such as 
>> (keySet().toArray, values.toArray) are made synchronized again
>> - individual entry read methods (get, containsKey, ...) are not 
>> synchronized.
>> This way we get the benefits of non-synchronized read access but the 
>> change is hardly observable. In particular since external 
>> synchronization on the Properties object makes guarded code atomic 
>> like it is now and individual entry read accesses are almost 
>> equivalent whether they are synchronized or not and I would be 
>> surprised if any code using Properties for the purpose they were 
>> designed for worked any differently.
> I agree that making read-only methods not synchronized while keeping 
> any method with write-access with synchronized is pretty safe change 
> and low compatibility risk.  On the other hand, would most of the 
> overrridden methods be synchronized then?

Yes, and that doesn't seem to be a problem. Setting properties is not 
very frequent operation and is usually quite localized. Reading 
properties is, on the other hand, a very frequent operation dispersed 
throughout the code (almost like logging) and therefore very prone to 
deadlocks like the one in this issue. I think that by having an 
unsynchronized get(Property), most problems with Properties will be 
solved - deadlock and performance (scalability) related.

Regards, Peter

> Mandy

More information about the core-libs-dev mailing list