< prev index next >

src/share/vm/oops/instanceKlass.cpp

Print this page

        

@@ -1039,11 +1039,12 @@
   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) {
+  // 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,11 +1053,12 @@
       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);
+        // 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 >