Request for review: 6922246: Deadlock during intensive class loading in parallel
David Holmes
David.Holmes at oracle.com
Tue Oct 19 15:59:46 PDT 2010
Hi Coleen,
coleen phillimore said the following on 10/20/10 08:11:
> Summary: allocate methodData before taking out the MethodData_lock
> open webrev at http://cr.openjdk.java.net/~coleenp/6922246/
> bug link at http://bugs.sun.com/view_bug.do?bug_id=6922246
>
> Thanks to Ramki for the diagnosis and suggestion for the fix.
This is a variation on the unsafe double-checked-locking idiom.
286 if (method->method_data() == NULL) {
291 methodDataOop method_data = oopFactory::new_methodData(method,
CHECK);
292 MutexLocker ml(MethodData_lock, THREAD);
295 if (method->method_data() == NULL) {
296 method->set_method_data(method_data);
In general terms any stores associated with the method_data construction
are not guaranteed to be visible by the time set_method_data is called.
A second thread could then see a non-null method->method_data() but
access uninitialized method_data values.
A general solution would need memory barriers before 286 and after 291
to ensure correctness on all platforms. A simpler, though perhaps
heavier solution would be to use a MutexUnlocker around the allocation:
MutexLocker ml(MethodData_lock, THREAD);
if (method->method_data() == NULL) {
methodDataOop method_data = NULL;
{ // need new block for scope
MutexUnLocker ml(MethodData_lock, THREAD);
method_data = oopFactory::new_methodData(method, CHECK);
}
// someone might have beaten us to it
if (method->method_data() == NULL) {
method->set_method_data(method_data);
}
}
A lock-less solution as Tom proposed would also require suitable
memory-barriers.
David
More information about the hotspot-runtime-dev
mailing list