<core-libs-dev> sun.management.Agent: the properties.putAll API may fail with ConcurrentModifcationException on multi-thread scenario
Deven You
youdwei at linux.vnet.ibm.com
Mon Apr 23 00:43:08 PDT 2012
Thanks David,
So is it ok for you to contribute this patch?
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
>
--
Best Regards,
Deven
More information about the serviceability-dev
mailing list