The ClassLoader case hadn't been addressed yet so ...

On 3/08/2012 4:52 AM, Yu Lin wrote:
Also, there are some code in OpenJDK7u that avoid the above
interleaving by adding synchronizations. For example in
jdk/src/share/classes/java/lang/ClassLoader.java from line 932 to 937

L932   synchronized (this) {
L933       pcerts = package2certs.get(pname);
L934       if (pcerts == null) {
L935           package2certs.put(pname, (certs == null? nocerts:certs));
L936       }
L937   }

However, if we use "putIfAbsent" at line 592, the synchronization at
line 588 is no longer needed. Generally, using "putIfAbsent" has
better performace than synchronizing a concurrent hashmap.

Note that if the above code is executed it means that we are not dealing with a parallel-capable loader, which means that package2certs is a Hashtable not a ConcurrentHashMap. The complete code section is actually:

        if (parallelLockMap == null) {
            synchronized (this) {
                pcerts = package2certs.get(pname);
                if (pcerts == null) {
package2certs.put(pname, (certs == null? nocerts:certs));
                }
            }
        } else {
pcerts = ((ConcurrentHashMap<String, Certificate[]>)package2certs).
                putIfAbsent(pname, (certs == null? nocerts:certs));
        }

David
-----

Reply via email to