< prev index next >

src/share/vm/oops/instanceKlass.cpp

Print this page

        

*** 1039,1049 **** instanceKlassHandle this_k(THREAD, this); return array_klass_impl(this_k, or_null, n, THREAD); } Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) { ! if (this_k->array_klasses() == NULL) { if (or_null) return NULL; ResourceMark rm; JavaThread *jt = (JavaThread *)THREAD; { --- 1039,1050 ---- instanceKlassHandle this_k(THREAD, this); return array_klass_impl(this_k, or_null, n, THREAD); } Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) { ! // Need load-acquire for lock-free read ! if (this_k->array_klasses_acquire() == NULL) { if (or_null) return NULL; ResourceMark rm; JavaThread *jt = (JavaThread *)THREAD; {
*** 1052,1062 **** MutexLocker ma(MultiArray_lock, THREAD); // Check if update has already taken place if (this_k->array_klasses() == NULL) { Klass* k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL); ! this_k->set_array_klasses(k); } } } // _this will always be set at this point ObjArrayKlass* oak = (ObjArrayKlass*)this_k->array_klasses(); --- 1053,1064 ---- MutexLocker ma(MultiArray_lock, THREAD); // Check if update has already taken place if (this_k->array_klasses() == NULL) { Klass* k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL); ! // use 'release' to pair with lock-free load ! this_k->release_set_array_klasses(k); } } } // _this will always be set at this point ObjArrayKlass* oak = (ObjArrayKlass*)this_k->array_klasses();
< prev index next >