Java同步语句

Ver*_*ing 0 java synchronization synchronized-block reentrantlock

我需要像这样的线程安全的arraylist.

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);
    }   
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 我使用的synchronized块是否相当于

    ...
    public synchronized void addBooking(Booking booking) {
      bookings.add(booking);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我应该像这样使用ReentrantLock吗?

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

Pra*_*eek 6

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

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