我需要这样的线程安全数组列表。
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();
}
}
最佳答案
您不需要同步添加或删除之类的简单操作,因为这是由实现内部处理的,这正是您使用它们的原因:避免自己处理同步
但是,对于超出内部同步范围的复合操作(如迭代或多次删除),您必须提供自己的锁定机制。