我需要这样的线程安全数组列表。

public class BookingList {

  private List<Booking> bookings;

  public BookingList() {
      bookings = Collections.synchronizedList(new ArrayList<Booking>());
  }

  @Override
  public void addBooking(Booking booking)
  {
    synchronized (bookings) {
        bookings.add(booking);
    }
  }

  @Override
  public void removeBooking(Booking booking)
  {
    synchronized (bookings) {
        bookings.remove(booking);
    }
  }
}


根据java doc的说明,使用Collections.synchronizedList时,需要同步对列表的每次访问。我不确定我的同步块是否会这样做?


我使用同步块等于

...
public synchronized void addBooking(Booking booking) {
  bookings.add(booking);
}

我应该像这样使用ReentrantLock吗

private Lock lock = new ReentrantLock();
public void addBooking(Booking booking) {
  try {
    lock.lock;
    bookings.add(booking);
  } finally {
    lock.release();
  }
}

最佳答案

您不需要同步添加或删除之类的简单操作,因为这是由实现内部处理的,这正是您使用它们的原因:避免自己处理同步

但是,对于超出内部同步范围的复合操作(如迭代或多次删除),您必须提供自己的锁定机制。

10-02 11:34