Java同步语句

时间:2013-06-20 13:38:02

标签: java synchronization reentrantlock synchronized-block

我需要像这样的线程安全的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);
    }   
  }
}

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

  1. 我使用的synchronized块是否等同于

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

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

2 个答案:

答案 0 :(得分:6)

您无需同步简单操作,例如添加删除,因为这是由实施内部处理的,这正是为什么你使用它们:避免自己处理同步

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

答案 1 :(得分:3)

回答你的问题:

1:

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

相当于

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

2:对于您的示例,您不应使用ReentrantLock。调用已使用Collections.synchronizedList()初始化的列表的方法是线程安全的,不能再使用synchronized或其他锁定机制。其余的请参阅@ Pragmateek的回答。