Chapter 2: Protect Your Shared Mutable Collection

Use Synchronized Collections

/** thread-safe */
class Crew {

  /** guarded by 'members' */
  private final List<String> members = new ArrayList<>();

  void add(String name) {
    synchronized (this.members) {
      if (!this.members.contains(name)) {
        this.members.add(name);
      }
    }
  }

  int size() {
    synchronized (this.members) {
      return this.members.size();
    }
  }
}
  • requires a lot of code, lots of things to get wrong if not being careful
/** thread-safe */
class Crew {

  /** guarded by 'members' */
  private final List<String> members = Collections.synchronizedList(new ArrayList<>());

  void add(String name) {
    synchronized (this.members) {
      if (!this.members.contains(name)) {
        this.members.add(name);
      }
    }
  }

  int size() {
    return this.members.size();
  }
}
  • still synchronized required for the two-step add, but can simplify the size calculation