RFR 8080911: sun/security/krb5/auto/UseCacheAndStoreKey.java timed out intermittently
Sean Mullan
sean.mullan at oracle.com
Tue May 26 12:51:11 UTC 2015
I would use the Initialization-on-demand holder idiom [1] instead, ex:
private static class SingletonHolder {
private static final Config singleton = new Config();
}
public static Config getInstance() throws KrbException {
return SingletonHolder.singleton;
}
This way you avoid synchronized altogether.
--Sean
[1] http://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
On 05/26/2015 12:50 AM, Xuelei Fan wrote:
> I do not like class level synchronization because it may not work as
> expected, especially if the synchronization can be used by other codes.
> However, your update does not change this behavior. The fix looks fine
> to me. Please go ahead if you don't want to use object level
> synchronization.
>
> Xuelei
>
> On 5/26/2015 10:40 AM, Weijun Wang wrote:
>>
>>
>> On 5/26/2015 9:22 AM, Xuelei Fan wrote:
>>> On 5/26/2015 9:06 AM, Weijun Wang wrote:
>>>> On 5/26/2015 7:59 AM, Xuelei Fan wrote:
>>>>> synchronized on class looks a little bit unsafe to me.
>>>>
>>>> Why? Isn't it the same as making a static method synchronized? [1]
>>>>
>>> Other code may be also able to lock on class.
>>>
>>> Code 1:
>>> lock on MyClass.class
>>>
>>> Code 2:
>>> lock on MyClass.class
>>>
>>> Code 1 and 2 know nothing about each other. The behavior may be weird.
>>> I don't think it is a good practice.
>>
>> So you are not a fan of all synchronized methods? :-)
>>
>> I thought it's quite common to use synchronized static methods to
>> prevent simultaneous access to a static field. While a method in another
>> class can lock on thisClass.class (in this case the class is internal),
>> I don't see why it wants to do this. This is not casual, it's just evil.
>>
>>>
>>>>> As singleton is
>>>>> a static variable, creating the instance during initialization looks
>>>>> safer.
>>>>>
>>>>> - private static Config singleton = null;
>>>>> + private static Config singleton = new Config();
>>>>
>>>> This line might throw an exception. Also, do you intend to make
>>>> getInstance() simply returning singleton? This means if the first call
>>>> to new Config() throws an exception, getInstance() will not try to
>>>> reconstruct it. This might not be common in production, but I don't want
>>>> to make any behavior change.
>>>>
>>> I see you point. Maybe, you can lock on a object.
>>
>> A private static final Object? Yes I can, but is it worth doing?
>>
>> Thanks
>> Max
>>
>>>
>>> Xuelei
>>>
>>>> --Max
>>>>
>>>> [1]
>>>> https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.3.6
>>>>
>>>>>
>>>>> Xuelei
>>>>>
>>>>> On 5/25/2015 10:16 PM, Weijun Wang wrote:
>>>>>> Hi All
>>>>>>
>>>>>> Please review a code change at
>>>>>>
>>>>>> http://cr.openjdk.java.net/~weijun/8080911/webrev.00/
>>>>>>
>>>>>> I've limit the synchronized block to Config creation only and
>>>>>> therefore
>>>>>> won't deadlock with EType's class initialization.
>>>>>>
>>>>>> Noreg-hard. The EType call is at class initialization and only run
>>>>>> once
>>>>>> in a VM session, which is extremely difficult to catch.
>>>>>>
>>>>>> Thanks
>>>>>> Max
>>>>>
>>>
>
More information about the security-dev
mailing list