学习线程和并发。考虑以下代码:
class A {
protected final Object lock = new Object();
public void remove(Object obj){
synchronized(lock){
// remove the object
}
}
public void add(Object obj){
synchronized(lock){
// add the object
}
}
}
这段代码是线程安全的,因为在一个线程正在添加或删除时,没有两个不同的线程可以同时进行add
或remove
操作。
现在考虑A的以下子类:
class B extends A {
public void update1(Object original, Object newObj){
remove(original);
add(original);
}
public void update2(Object original, Object newObj){
synchronized(lock) {
remove(original);
add(newObj);
}
}
}
类 B
必须实现一个线程安全的 update
方法。据我所知,update1
不是线程安全的,因为该操作不是原子的,即在执行 remove
和 add
之间没有同步(如果我错了请纠正)。
update2
是否是实现线程安全的 update
方法的正确方式?是否存在在同一 lock
上嵌套同步块的缺点?
update1
中,另一个线程可能会在调用之间进行删除或添加。 - Sotirios Delimanolis