這是本文件的舊版!


Effective Java - Avoid excessive synchronization

這個Item的宗旨如字面上的意思:「避免過度的使用synchronized」。Effective Java在這個Item中有以下幾個重點:

  • 有使用synchronized控制的method,不要讓client有機會override以避免liveness與safety failures。
  • synchronized block中,為了效能著想,工作越少越好。
  • 善用同步的方法,沒有需要就不要用。

首先針對第一點,可以用以下範例做說明:

public class ObservableSet<E> extends ForwardingSet<E> {
  public ObservableSet(Set<E> set) { super(set); }
  private final List<SetObserver<E>> observers= new ArrayList<>();
  public void addObserver(SetObserver<E> observer) {
    synchronized(observers) {
      observers.add(observer);
    }
  }
  public Boolean removeObserver(SetObserver<E> observer) {
    synchronized(observers) {
      return observers.remove(observer);
    }
  }
}
由於addObserver與removeObserver都可以override,

Effective Java第三版Item 79。

  • Effective Java, 3/e