我需要像这样的线程安全的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时,需要同步对列表的每次访问。我不确定我的同步块是否会这样做?
我使用的synchronized块是否等同于
...
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();
}
}
答案 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的回答。