Correct ValueMembers creation, caching for ValueDescriptor, ArrayDescriptor
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
index 2cedbfa..ca4e0b1 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ArrayDescriptor.java
@@ -185,27 +185,20 @@
         _out.write_value((Serializable)value, getRepositoryID());
     }
 
-    ValueMember[] getValueMembers() {
+    @Override
+    protected final ValueMember[] genValueMembers() {
+        final ValueMember[] members = new ValueMember[1];
+        final TypeDescriptor elemDesc = repo.getDescriptor(elementType);
+        final String elemRepID = elemDesc.getRepositoryID();
 
-        if (_value_members == null) {
+        final ORB orb = ORB.init();
+        TypeCode memberTC = orb.create_sequence_tc(0, elemDesc.getTypeCode());
 
-            _value_members = new ValueMember[1];
-
-            TypeDescriptor elemDesc = repo.getDescriptor(elementType);
-
-            String elemRepID = elemDesc.getRepositoryID();
-
-            ORB orb = ORB.init();
-            TypeCode memberTC = orb.create_sequence_tc(0, elemDesc
-                    .getTypeCode());
-
-            _value_members[0] = new ValueMember("", // member has no name!
+        members[0] = new ValueMember("", // member has no name!
                     elemRepID, this.getRepositoryID(), "1.0", memberTC, null,
                     (short) 1);
-            // public
-        }
 
-        return _value_members;
+        return members;
     }
 
     @Override
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
index e6b1849..eb91e9f 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/ValueDescriptor.java
@@ -821,19 +821,20 @@
         return _hash_code;
     }
 
-    protected ValueMember[] _value_members = null;
-
-    private ValueMember[] getValueMembers() {
-        getTypeCode(); // ensure recursion through typecode for non-array types
-
-        if (_value_members == null) {
-            _value_members = new ValueMember[_fields.length];
-            for (int i = 0; i < _fields.length; i++) {
-                _value_members[i] = _fields[i].getValueMember(repo);
-            }
+    private volatile ValueMember[] valueMembers = null;
+    protected ValueMember[] genValueMembers() {
+        final ValueMember[] members = new ValueMember[_fields.length];
+        for (int i = 0; i < _fields.length; i++) {
+            members[i] = _fields[i].getValueMember(repo);
         }
 
-        return _value_members;
+        return members;
+    }
+    final ValueMember[] getValueMembers() {
+        getTypeCode(); // ensure recursion through typecode for non-array types
+
+        if (null == valueMembers) valueMembers = genValueMembers();
+        return valueMembers;
     }
 
     @Override