hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 40887 8d35e19f5548
parent 40655 9f644073d3a0
child 40894 7d17619c0140
equal deleted inserted replaced
40886:98cb935dc074 40887:8d35e19f5548
  1039   instanceKlassHandle this_k(THREAD, this);
  1039   instanceKlassHandle this_k(THREAD, this);
  1040   return array_klass_impl(this_k, or_null, n, THREAD);
  1040   return array_klass_impl(this_k, or_null, n, THREAD);
  1041 }
  1041 }
  1042 
  1042 
  1043 Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) {
  1043 Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_k, bool or_null, int n, TRAPS) {
  1044   if (this_k->array_klasses() == NULL) {
  1044   // Need load-acquire for lock-free read
       
  1045   if (this_k->array_klasses_acquire() == NULL) {
  1045     if (or_null) return NULL;
  1046     if (or_null) return NULL;
  1046 
  1047 
  1047     ResourceMark rm;
  1048     ResourceMark rm;
  1048     JavaThread *jt = (JavaThread *)THREAD;
  1049     JavaThread *jt = (JavaThread *)THREAD;
  1049     {
  1050     {
  1052       MutexLocker ma(MultiArray_lock, THREAD);
  1053       MutexLocker ma(MultiArray_lock, THREAD);
  1053 
  1054 
  1054       // Check if update has already taken place
  1055       // Check if update has already taken place
  1055       if (this_k->array_klasses() == NULL) {
  1056       if (this_k->array_klasses() == NULL) {
  1056         Klass*    k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL);
  1057         Klass*    k = ObjArrayKlass::allocate_objArray_klass(this_k->class_loader_data(), 1, this_k, CHECK_NULL);
  1057         this_k->set_array_klasses(k);
  1058         // use 'release' to pair with lock-free load
       
  1059         this_k->release_set_array_klasses(k);
  1058       }
  1060       }
  1059     }
  1061     }
  1060   }
  1062   }
  1061   // _this will always be set at this point
  1063   // _this will always be set at this point
  1062   ObjArrayKlass* oak = (ObjArrayKlass*)this_k->array_klasses();
  1064   ObjArrayKlass* oak = (ObjArrayKlass*)this_k->array_klasses();