Avoid duplicate processing with selective locking, improving performance.
diff --git a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
index ed66893..aea1298 100755
--- a/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
+++ b/yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/TypeDescriptor.java
@@ -208,14 +208,17 @@
@Override
protected void init() {
- typeCode = genTypeCode();
+ getTypeCode();
}
private volatile TypeCode typeCode = null;
protected abstract TypeCode genTypeCode();
final TypeCode getTypeCode() {
- // typeCode should have already been set from within init(), so this is just defensive
- if (null == typeCode) typeCode = genTypeCode();
+ if (null == typeCode) {
+ synchronized (repo) {
+ if (null == typeCode) typeCode = genTypeCode();
+ }
+ }
return typeCode;
}
protected final void setTypeCode(TypeCode tc) {
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 eb91e9f..6e66d1c 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
@@ -831,9 +831,12 @@
return members;
}
final ValueMember[] getValueMembers() {
- getTypeCode(); // ensure recursion through typecode for non-array types
-
- if (null == valueMembers) valueMembers = genValueMembers();
+ getTypeCode(); // ensure recursion through typecode
+ if (null == valueMembers) {
+ synchronized (repo) {
+ if (null == valueMembers) valueMembers = genValueMembers();
+ }
+ }
return valueMembers;
}