Author: violetagg
Date: Sat Jan 2 20:36:49 2016
New Revision: 1722663
URL: http://svn.apache.org/viewvc?rev=1722663&view=rev
Log:
Fix a FindBugs issue (incorrect synchronization)
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java
Modified:
tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java
URL:
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java?rev=1722663&r1=1722662&r2=1722663&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/modeler/ManagedBean.java
Sat Jan 2 20:36:49 2016
@@ -22,6 +22,9 @@ package org.apache.tomcat.util.modeler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean;
@@ -53,6 +56,8 @@ public class ManagedBean implements java
static final Class<?>[] NO_ARGS_PARAM_SIG = new Class[0];
+ private ReadWriteLock mBeanInfoLock = new ReentrantReadWriteLock();
+
/**
* The <code>ModelMBeanInfo</code> object that corresponds
* to this <code>ManagedBean</code> instance.
@@ -112,8 +117,14 @@ public class ManagedBean implements java
}
public void setClassName(String className) {
- this.className = className;
- this.info = null;
+ Lock l = mBeanInfoLock.writeLock();
+ l.lock();
+ try {
+ this.className = className;
+ this.info = null;
+ } finally {
+ l.unlock();
+ }
}
@@ -133,8 +144,14 @@ public class ManagedBean implements java
}
public void setDescription(String description) {
- this.description = description;
- this.info = null;
+ Lock l = mBeanInfoLock.writeLock();
+ l.lock();
+ try {
+ this.description = description;
+ this.info = null;
+ } finally {
+ l.unlock();
+ }
}
@@ -182,8 +199,14 @@ public class ManagedBean implements java
}
public void setName(String name) {
- this.name = name;
- this.info = null;
+ Lock l = mBeanInfoLock.writeLock();
+ l.lock();
+ try {
+ this.name = name;
+ this.info = null;
+ } finally {
+ l.unlock();
+ }
}
@@ -215,8 +238,14 @@ public class ManagedBean implements java
}
public void setType(String type) {
- this.type = type;
- this.info = null;
+ Lock l = mBeanInfoLock.writeLock();
+ l.lock();
+ try {
+ this.type = type;
+ this.info = null;
+ } finally {
+ l.unlock();
+ }
}
@@ -270,7 +299,10 @@ public class ManagedBean implements java
*/
public void addNotification(NotificationInfo notification) {
- synchronized (notifications) {
+ Lock l = mBeanInfoLock.writeLock();
+
+ l.lock();
+ try {
NotificationInfo results[] =
new NotificationInfo[notifications.length + 1];
System.arraycopy(notifications, 0, results, 0,
@@ -278,8 +310,9 @@ public class ManagedBean implements java
results[notifications.length] = notification;
notifications = results;
this.info = null;
+ } finally {
+ l.unlock();
}
-
}
@@ -398,21 +431,30 @@ public class ManagedBean implements java
MBeanInfo getMBeanInfo() {
// Return our cached information (if any)
- if (info != null)
- return (info);
+ Lock l = mBeanInfoLock.readLock();
+ l.lock();
+ try {
+ if (info != null)
+ return info;
+ } finally {
+ l.unlock();
+ }
- // Create subordinate information descriptors as required
- AttributeInfo attrs[] = getAttributes();
- MBeanAttributeInfo attributes[] =
- new MBeanAttributeInfo[attrs.length];
- for (int i = 0; i < attrs.length; i++)
- attributes[i] = attrs[i].createAttributeInfo();
-
- OperationInfo opers[] = getOperations();
- MBeanOperationInfo operations[] =
- new MBeanOperationInfo[opers.length];
- for (int i = 0; i < opers.length; i++)
- operations[i] = opers[i].createOperationInfo();
+ l = mBeanInfoLock.writeLock();
+ l.lock();
+ try {
+ // Create subordinate information descriptors as required
+ AttributeInfo attrs[] = getAttributes();
+ MBeanAttributeInfo attributes[] =
+ new MBeanAttributeInfo[attrs.length];
+ for (int i = 0; i < attrs.length; i++)
+ attributes[i] = attrs[i].createAttributeInfo();
+
+ OperationInfo opers[] = getOperations();
+ MBeanOperationInfo operations[] =
+ new MBeanOperationInfo[opers.length];
+ for (int i = 0; i < opers.length; i++)
+ operations[i] = opers[i].createOperationInfo();
// ConstructorInfo consts[] = getConstructors();
@@ -420,21 +462,21 @@ public class ManagedBean implements java
// new ModelMBeanConstructorInfo[consts.length];
// for (int i = 0; i < consts.length; i++)
// constructors[i] = consts[i].createConstructorInfo();
-
- NotificationInfo notifs[] = getNotifications();
- MBeanNotificationInfo notifications[] =
- new MBeanNotificationInfo[notifs.length];
- for (int i = 0; i < notifs.length; i++)
- notifications[i] = notifs[i].createNotificationInfo();
-
- // Construct and return a new ModelMBeanInfo object
- info = new MBeanInfo(getClassName(),
- getDescription(),
- attributes,
- new MBeanConstructorInfo[] {},
- operations,
- notifications);
+ NotificationInfo notifs[] = getNotifications();
+ MBeanNotificationInfo notifications[] =
+ new MBeanNotificationInfo[notifs.length];
+ for (int i = 0; i < notifs.length; i++)
+ notifications[i] = notifs[i].createNotificationInfo();
+
+
+ // Construct and return a new ModelMBeanInfo object
+ info = new MBeanInfo(getClassName(),
+ getDescription(),
+ attributes,
+ new MBeanConstructorInfo[] {},
+ operations,
+ notifications);
// try {
// Descriptor descriptor = info.getMBeanDescriptor();
// Iterator fields = getFields().iterator();
@@ -447,8 +489,10 @@ public class ManagedBean implements java
// ;
// }
- return (info);
-
+ return info;
+ } finally {
+ l.unlock();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]