fer*_*hur 2 java multithreading synchronization synchronized
了解线程和并发性.请考虑以下代码:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码是线程安全的,因为没有两个不同的线程可以add或remove当一个线程正在添加或删除过程中.
现在考虑A的以下sublcass:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
类B必须实现线程安全的update方法.现在,据我所知,update1这不是线程安全的,因为操作不是原子的,即执行remove和之间没有同步add(如果错误则纠正我).
是update2实现线程安全update方法的正确方法吗?嵌套同步块是否有任何缺点lock?
是
update2实现线程安全更新方法的正确方法吗?
是的.您已达到原子性,并且您与个人add和remove方法的调用者兼容.
在同一个锁上嵌套同步块有什么缺点吗?
不,因为锁是可重入的,这意味着第二次采集除了记住再次获取锁之外没有做任何事情,因此在执行两次释放操作之前它不会被释放.
| 归档时间: |
|
| 查看次数: |
1249 次 |
| 最近记录: |