<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
Mon Apr 23 00:52:03 PDT 2012


On 23/04/2012 5:43 PM, Deven You wrote:
> Thanks David,
>
> So is it ok for you to contribute this patch?

You can count me as a Reviewer, but it still needs sign-off from Mandy 
as a serviceability representative.

I don't have the spare cycles to act as sponsor for this if you need 
someone to push it.

David
------

> On 04/23/2012 02:36 PM, David Holmes wrote:
>> Except of course that Properties is a Hashtable and synchronizes on
>> 'this' for all public methods. So locking the properties object in the
>> client code will guarantee exclusive access to it.
>>
>> Sorry about that.
>>
>> David
>> -----
>>
>> On 23/04/2012 4:30 PM, David Holmes wrote:
>>> 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