6608764: PropertyChangeListeners machinery should have a better locking scheme

Change to use a private final object java.awt.Component.changeSupportLock for locking purposes instead of using this

Reviewed-by: son, ant
This commit is contained in:
Anthony Petrov 2008-03-18 12:04:20 +03:00
parent 9e5bc6d8bf
commit 2095e90fb0

View file

@ -634,6 +634,11 @@ public abstract class Component implements ImageObserver, MenuContainer,
*/ */
private PropertyChangeSupport changeSupport; private PropertyChangeSupport changeSupport;
private transient final Object changeSupportLock = new Object();
private Object getChangeSupportLock() {
return changeSupportLock;
}
boolean isPacked = false; boolean isPacked = false;
/** /**
@ -7839,8 +7844,9 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see #getPropertyChangeListeners * @see #getPropertyChangeListeners
* @see #addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) * @see #addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener)
*/ */
public synchronized void addPropertyChangeListener( public void addPropertyChangeListener(
PropertyChangeListener listener) { PropertyChangeListener listener) {
synchronized (getChangeSupportLock()) {
if (listener == null) { if (listener == null) {
return; return;
} }
@ -7849,6 +7855,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
} }
changeSupport.addPropertyChangeListener(listener); changeSupport.addPropertyChangeListener(listener);
} }
}
/** /**
* Removes a PropertyChangeListener from the listener list. This method * Removes a PropertyChangeListener from the listener list. This method
@ -7863,13 +7870,15 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see #getPropertyChangeListeners * @see #getPropertyChangeListeners
* @see #removePropertyChangeListener(java.lang.String,java.beans.PropertyChangeListener) * @see #removePropertyChangeListener(java.lang.String,java.beans.PropertyChangeListener)
*/ */
public synchronized void removePropertyChangeListener( public void removePropertyChangeListener(
PropertyChangeListener listener) { PropertyChangeListener listener) {
synchronized (getChangeSupportLock()) {
if (listener == null || changeSupport == null) { if (listener == null || changeSupport == null) {
return; return;
} }
changeSupport.removePropertyChangeListener(listener); changeSupport.removePropertyChangeListener(listener);
} }
}
/** /**
* Returns an array of all the property change listeners * Returns an array of all the property change listeners
@ -7885,12 +7894,14 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see java.beans.PropertyChangeSupport#getPropertyChangeListeners * @see java.beans.PropertyChangeSupport#getPropertyChangeListeners
* @since 1.4 * @since 1.4
*/ */
public synchronized PropertyChangeListener[] getPropertyChangeListeners() { public PropertyChangeListener[] getPropertyChangeListeners() {
synchronized (getChangeSupportLock()) {
if (changeSupport == null) { if (changeSupport == null) {
return new PropertyChangeListener[0]; return new PropertyChangeListener[0];
} }
return changeSupport.getPropertyChangeListeners(); return changeSupport.getPropertyChangeListeners();
} }
}
/** /**
* Adds a PropertyChangeListener to the listener list for a specific * Adds a PropertyChangeListener to the listener list for a specific
@ -7923,9 +7934,10 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see #getPropertyChangeListeners(java.lang.String) * @see #getPropertyChangeListeners(java.lang.String)
* @see #addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener) * @see #addPropertyChangeListener(java.lang.String, java.beans.PropertyChangeListener)
*/ */
public synchronized void addPropertyChangeListener( public void addPropertyChangeListener(
String propertyName, String propertyName,
PropertyChangeListener listener) { PropertyChangeListener listener) {
synchronized (getChangeSupportLock()) {
if (listener == null) { if (listener == null) {
return; return;
} }
@ -7934,6 +7946,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
} }
changeSupport.addPropertyChangeListener(propertyName, listener); changeSupport.addPropertyChangeListener(propertyName, listener);
} }
}
/** /**
* Removes a <code>PropertyChangeListener</code> from the listener * Removes a <code>PropertyChangeListener</code> from the listener
@ -7951,14 +7964,16 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see #getPropertyChangeListeners(java.lang.String) * @see #getPropertyChangeListeners(java.lang.String)
* @see #removePropertyChangeListener(java.beans.PropertyChangeListener) * @see #removePropertyChangeListener(java.beans.PropertyChangeListener)
*/ */
public synchronized void removePropertyChangeListener( public void removePropertyChangeListener(
String propertyName, String propertyName,
PropertyChangeListener listener) { PropertyChangeListener listener) {
synchronized (getChangeSupportLock()) {
if (listener == null || changeSupport == null) { if (listener == null || changeSupport == null) {
return; return;
} }
changeSupport.removePropertyChangeListener(propertyName, listener); changeSupport.removePropertyChangeListener(propertyName, listener);
} }
}
/** /**
* Returns an array of all the listeners which have been associated * Returns an array of all the listeners which have been associated
@ -7974,13 +7989,15 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see #getPropertyChangeListeners * @see #getPropertyChangeListeners
* @since 1.4 * @since 1.4
*/ */
public synchronized PropertyChangeListener[] getPropertyChangeListeners( public PropertyChangeListener[] getPropertyChangeListeners(
String propertyName) { String propertyName) {
synchronized (getChangeSupportLock()) {
if (changeSupport == null) { if (changeSupport == null) {
return new PropertyChangeListener[0]; return new PropertyChangeListener[0];
} }
return changeSupport.getPropertyChangeListeners(propertyName); return changeSupport.getPropertyChangeListeners(propertyName);
} }
}
/** /**
* Support for reporting bound property changes for Object properties. * Support for reporting bound property changes for Object properties.
@ -7994,7 +8011,10 @@ public abstract class Component implements ImageObserver, MenuContainer,
*/ */
protected void firePropertyChange(String propertyName, protected void firePropertyChange(String propertyName,
Object oldValue, Object newValue) { Object oldValue, Object newValue) {
PropertyChangeSupport changeSupport = this.changeSupport; PropertyChangeSupport changeSupport;
synchronized (getChangeSupportLock()) {
changeSupport = this.changeSupport;
}
if (changeSupport == null || if (changeSupport == null ||
(oldValue != null && newValue != null && oldValue.equals(newValue))) { (oldValue != null && newValue != null && oldValue.equals(newValue))) {
return; return;