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
-----