Java同步语句

Java同步语句,java,synchronization,reentrantlock,synchronized-block,Java,Synchronization,Reentrantlock,Synchronized Block,我需要这样的线程安全阵列列表 public class BookingList { private List<Booking> bookings; public BookingList() { bookings = Collections.synchronizedList(new ArrayList<Booking>()); } @Override public void addBooking(Booking booking) {

我需要这样的线程安全阵列列表

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);
    }   
  }
}
我应该使用这样的可重入锁定吗

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

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


但对于不在内部同步范围内的迭代或多次删除等复合操作,您必须提供自己的锁定机制。

要回答您的问题:

1:

相当于

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

2:例如,您不应该使用ReentrantLock。调用已使用集合初始化的列表的方法。synchronizedList是线程安全的,无需使用进一步的同步或其他锁定机制。其余内容请参见@Pragmateek的答案。

在本例中:是的!你可以参考此链接,它将解决你的问题[单击此处][1][1]:this.class应该是this:True。我改了。此类将用于静态方法。谢谢。。这是有道理的,但是我有一个不同步的add方法和一个进行某种迭代的方法。然后我只在迭代方法上进行同步。Java如何知道add和iteration方法的同步是相同的?澄清一下:我看到两个不同的线程不能同时调用add,但是一个线程可以调用add,另一个线程可以调用iteration.method吗?如果您在整个列表上同步,您应该不会有任何问题:synchronizedbookings{//iterate…},因为add方法和您的迭代都将使用相同的锁。
public void addBooking(Booking booking) {
   synchronized (this){
       bookings.add(booking);
   }
}