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);
}
}