私はこのようなクラスを持っています(無関係なコードは削除されています):
public final class Card {
private boolean important;
public boolean isImportant() {
return important;
}
public void setImportant(boolean isImportant) {
this.important = isImportant;
fireIsImportantChangedEvent(isImportant);
}
private EventListenerList listenerList = new EventListenerList();
private void fireIsImportantChangedEvent(boolean newValue) {
for (CardListener listener : listenerList.getListeners(CardListener.class)) {
listener.isImportantChanged(new CardEvent<Boolean>(this, newValue));
}
}
}
このクラスをスレッド セーフにしようとしていますが、重要な ( public synchronized boolean isImportant() { ... }
and public synchronized void setImportant(boolean isImportant) { ... }
) にアクセスするメソッドを同期する必要があるのか、それとも重要な volatile ( private volatile boolean important;
) を宣言するだけなのかわかりません。setImportant()
volatile がイベントを発生させなかった場合 (イベントが発生した場合) は機能することを理解していthis.important = isImportant
ますが、このイベントを発生させた場合でも volatile は機能しますか?