Narrow the scope of a lock on dex to avoid deadlock.

Bug: 10899202.
Change-Id: I6247f895a11b41a70d7f43562d868dd91e8b1a91
diff --git a/vm/native/java_lang_Class.cpp b/vm/native/java_lang_Class.cpp
index e68be7b..c307353 100644
--- a/vm/native/java_lang_Class.cpp
+++ b/vm/native/java_lang_Class.cpp
@@ -765,14 +765,10 @@
     if (dvm_dex == NULL) {
         return NULL;
     }
-
-    ScopedPthreadMutexLock lock(&dvm_dex->modLock);
-
     // Already cached?
     if (dvm_dex->dex_object != NULL) {
         return dvm_dex->dex_object;
     }
-
     jobject byte_buffer = env->NewDirectByteBuffer(dvm_dex->memMap.addr, dvm_dex->memMap.length);
     if (byte_buffer == NULL) {
         return NULL;
@@ -799,7 +795,12 @@
         return NULL;
     }
 
-    dvm_dex->dex_object = env->NewGlobalRef(local_ref);
+    // Check another thread didn't cache an object, if we've won install the object.
+    ScopedPthreadMutexLock lock(&dvm_dex->modLock);
+
+    if (dvm_dex->dex_object != NULL) {
+        dvm_dex->dex_object = env->NewGlobalRef(local_ref);
+    }
     return dvm_dex->dex_object;
 }