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

Mandy Chung mandy.chung at oracle.com
Fri May 13 14:55:17 UTC 2016


Good idea.

Mandy

> On May 13, 2016, at 12:10 AM, Peter Levart <peter.levart at gmail.com> wrote:
> 
> Hi Brent,
> 
> 
> This looks good. It might also be a good idea to add a test that checks this new implementation detail (the unsynchronized get) that new code will become dependent upon, for example:
> 
> 
> /*
> * @test
> * @bug 8029891
> * @summary Test that the Properties.get() method does not synchronize any more
> * @run main CheckUnsynchronizedGet
> */
> public class CheckUnsynchronizedGet {
> 
>    public static void main(String[] args) {
>        Properties props = new Properties();
>        synchronized (props) {
>            props.setProperty("key", "value");
>            String value =
>                CompletableFuture.supplyAsync(() -> props.getProperty("key")).join();
>            assert "value".equals(value);
>        }
>    }
> }
> 
> What do you think?
> 
> Regards, Peter
> 
> On 05/13/2016 01:55 AM, Brent Christian wrote:
>> Update to the test, and additional comments:
>> 
>> http://cr.openjdk.java.net/~bchristi/8029891/webrev.5/webrev/
>> 
>> Thanks,
>> -Brent
>> 
>> On 5/12/16 4:15 PM, Mandy Chung wrote:
>>> 
>>>> On May 12, 2016, at 2:44 PM, Brent Christian <brent.christian at oracle.com> wrote:
>>>> 
>>>> On 5/12/16 11:44 AM, Mandy Chung wrote:
>>>>> 
>>>>> This patch looks good.
>>>>> 
>>>>> To help future readers to understand this, it may be better to move:
>>>>> 1152     private transient ConcurrentHashMap<Object, Object> map =
>>>>> 1153             new ConcurrentHashMap<>(8);
>>>>> 
>>>>> to the beginning and add a comment describing what are lock-free and what are synchronized (basically some part of your summary below).
>>>>> 
>>>>> Also a comment in Hashtable::defaultWriteHashtable and readHashtable methods to mention that they are overridden by Properties.
>>>> 
>>>> Good ideas.
>>>> 
>>>>> In the GetResource.java test, what is the reason taking out:
>>>>>   73   URL u2 = Thread.currentThread().getContextClassLoader().getResource("sun/util/resources/CalendarData.class”);
>>>>> 
>>>> 
>>>> It was coming back null and failing the test, I think because
>>>> Jigsaw moved CalendarData into a different module (jdk.localedata, I believe?).
>>> 
>>> src/java.base/share/classes/sun/util/resources/CalendarData.properties is still in java.base.  This is due to resource encapsulation. Unnamed module calling ClassLoader::getResource of a resource in a named module returns null.
>>> 
>>> 
>>>>  I fiddled with @modules a bit, but stopped when I discovered that when the test deadlocks, it hangs on the first call to getResource() and doesn't get to this line.
>>>> 
>>>> I can look into getting it to load CalendarData again, if you like.
>>> 
>>> The launcher and builtin class loader implementation has changed so much that the code path exercised JDK-6977738 no longer exists.  I think dropping line 73 is okay.
>>> 
>>> Mandy
>>> 
> 




More information about the core-libs-dev mailing list