<core-libs-dev> sun.management.Agent: the properties.putAll API may fail with ConcurrentModifcationException on multi-thread scenario

David Holmes david.holmes at oracle.com
Sun Apr 22 23:30:37 PDT 2012


Deven,

On 23/04/2012 3:54 PM, Deven You wrote:
> On 04/18/2012 02:20 PM, Deven You wrote:
>> On 04/18/2012 01:34 PM, Mandy Chung wrote:
>>>
>>>
>>> I think this could still run into CME. System Properties is not a
>>> synchronized map and the setter methods (System.setProperty or
>>> Properties.put method) doesn't synchronize on the Properties object.
>>>
>>>
>>> The setter methods I'm referring to are System.setProperty and
>>> System.getProperties().put().
>>>
>>
>> I have gone through the Agent.java, I think other set/put methods
>> related to properties are protected properly.
>>
>> public static void agentmain using parseString(args) which return a
>> properties which is a local var and is not possible to cause
>> concurrent problem when call config_props.putAll(arg_props).
>>
>> private static synchronized void startLocalManagementAgent() is
>> synchronized already.
>>
>> private static synchronized void startRemoteManagementAgent(String
>> args) is synchronized also.
>>
>> Could you point where the CME may ocurr?
>
> Is there any suggestion from the mailing list?

The problem is that System.getProperties() returns a globally accessible 
set of properties. So even if you prevent the Agent code from modifying 
those properties concurrently with other use in the Agent, you have no 
such guard for any other piece of code in the system which might also 
modify the properties. So the race condition you were trying to fix 
still exists. I don't see any way to fix this. No matter what you do 
another thread can modify the system properties while you are iterating 
them. Instead you need to anticipate the CME and try to recover from it 
(also non-trivial).

Cheers,
David Holmes


More information about the serviceability-dev mailing list