harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Elena Semukhina (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HARMONY-2982) [classlib][net ] java.net.URLClassLoader implementation is not thread safe.
Date Thu, 15 Feb 2007 11:33:06 GMT

    [ https://issues.apache.org/jira/browse/HARMONY-2982?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12473352
] 

Elena Semukhina commented on HARMONY-2982:
------------------------------------------

Mikhail, I think there is a kind of misunderstanding here :)

Actually a agreed with what you suggested. I just think that wrapping resCache is redundant
because we place its modification in a synchronized block. Here is my reasoning:

You suggested to keep the first call to get() out of the synch block and I fully agree with
this:

jf = resCache.get(thisUrl);   // yes, I missed this in my previous comment but I meant it
:)

If after that jf == null, the thread should find jf and put it to the map. We know that this
 needs to be done only once for each JarFile. If some thread has started this job and entered
synch block, any other thread which got jf == null will wait until the first thread exits
the block. Then the second thread enters the block and calls resCache.get() again to check
if it is still null (this is your suggestion and I again agree with it). If jf is not null
at this moment (and it obviously shouldn't be null here because the first thread should have
put a value), the second thread won't look for it and will exit synch block.

This is exactly your suggestion except resCache is not wrapped.

Do you think this won't work properly?



> [classlib][net ] java.net.URLClassLoader implementation is not thread safe.
> ---------------------------------------------------------------------------
>
>                 Key: HARMONY-2982
>                 URL: https://issues.apache.org/jira/browse/HARMONY-2982
>             Project: Harmony
>          Issue Type: Bug
>          Components: Classlib
>            Reporter: Elena Semukhina
>         Attachments: H-2982.patch, H-2982_1.patch
>
>
> The DRLVM smoke test classloader.StressLoader fails intermittently on both Linux and
Windows.
> To reproduce the failure you should run the test iteratively in the following way:
> while true; do $DRLVM -cp <path to smoke test classes> classloader.StressLoader;
done
> I observe two sorts of intermittent failures: 
> 1. java.lang.NullPointerException
> 	at java.net.URLClassLoader.explore(URLClassLoader.java:1200)
> 	at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:809)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java:667)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java)
> 	at java.security.AccessController.doPrivilegedImpl(Unknown Source)
> 	at java.security.AccessController.doPrivileged(Unknown Source)
> 	at java.net.URLClassLoader.findResource(URLClassLoader.java:665)
> 	at java.lang.ClassLoader$BootstrapLoader.findResource(Unknown Source)
> 	at java.lang.ClassLoader.getResource(Unknown Source)
> 	at java.lang.ClassLoader.getResourceAsStream(Unknown Source)
> 	at java.lang.ClassLoader.getSystemResourceAsStream(Unknown Source)
> 	at classloader.LogLoader.loadClass(Unknown Source)
> 	at classloader.StressLoader.run(Unknown Source)
> 2. java.lang.ArrayIndexOutOfBoundsException
> 	at java.util.IdentityHashMap.rehash(IdentityHashMap.java:501)
> 	at java.util.IdentityHashMap.put(IdentityHashMap.java:463)
> 	at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:720)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java:667)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java)
> 	at java.security.AccessController.doPrivilegedImpl(Unknown Source)
> 	at java.security.AccessController.doPrivileged(Unknown Source)
> 	at java.net.URLClassLoader.findResource(URLClassLoader.java:665)
> 	at java.lang.ClassLoader$BootstrapLoader.findResource(Unknown Source)
> 	at java.lang.ClassLoader.getResource(Unknown Source)
> 	at java.lang.ClassLoader.getResourceAsStream(Unknown Source)
> 	at java.lang.ClassLoader.getSystemResourceAsStream(Unknown Source)
> 	at classloader.LogLoader.loadClass(Unknown Source)
> 	at classloader.StressLoader.run(Unknown Source)
> java.lang.ArrayIndexOutOfBoundsException
> 	at java.util.IdentityHashMap.rehash(IdentityHashMap.java:501)
> 	at java.util.IdentityHashMap.put(IdentityHashMap.java:463)
> 	at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:720)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java:667)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java)
> 	at java.security.AccessController.doPrivilegedImpl(Unknown Source)
> 	at java.security.AccessController.doPrivileged(Unknown Source)
> 	at java.net.URLClassLoader.findResource(URLClassLoader.java:665)
> 	at java.lang.ClassLoader$BootstrapLoader.findResource(Unknown Source)
> 	at java.lang.ClassLoader.getResource(Unknown Source)
> 	at java.lang.ClassLoader.getResourceAsStream(Unknown Source)
> 	at java.lang.ClassLoader.getSystemResourceAsStream(Unknown Source)
> 	at classloader.LogLoader.loadClass(Unknown Source)
> 	at classloader.StressLoader.run(Unknown Source)
> java.lang.ArrayIndexOutOfBoundsException
> 	at java.util.IdentityHashMap.rehash(IdentityHashMap.java:501)
> 	at java.util.IdentityHashMap.put(IdentityHashMap.java:463)
> 	at java.net.URLClassLoader.findResourceImpl(URLClassLoader.java:720)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java:667)
> 	at java.net.URLClassLoader$5.run(URLClassLoader.java)
> 	at java.security.AccessController.doPrivilegedImpl(Unknown Source)
> 	at java.security.AccessController.doPrivileged(Unknown Source)
> 	at java.net.URLClassLoader.findResource(URLClassLoader.java:665)
> 	at java.lang.ClassLoader$BootstrapLoader.findResource(Unknown Source)
> 	at java.lang.ClassLoader.getResource(Unknown Source)
> 	at java.lang.ClassLoader.getResourceAsStream(Unknown Source)
> 	at java.lang.ClassLoader.getSystemResourceAsStream(Unknown Source)
> 	at classloader.LogLoader.loadClass(Unknown Source)
> 	at classloader.StressLoader.run(Unknown Source)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message