我想知道同步下面代码的原因是什么。我不认为会发生死锁吗?
private final Object lock = new Object();
private Hashtable content = new Hashtable();
public void deleteContent(Object key){
synchronized(lock){
if(content.containsKey(key)){
content.remove(key);
}
}
}
public Object getContent(Object key){
synchronized(lock){
return (Object) content.get(key);
}
}
答案 0 :(得分:4)
我不知道。
Hashtable
的实现已经同步,如果密钥不在表中,remove
方法不会执行任何操作。因此,可以删除所有synchronized
块(也是containsKey
检查)。
也许lock
在代码的其他地方使用,并且有一个原因。 (?)
答案 1 :(得分:3)
containsKey()和remove()之间存在竞争条件。锁可以避免竞争条件。
然而,它是相当无意义的,因为你可以单独调用remove()。
答案 2 :(得分:1)
你是对的 - 如果他们要同步它,他们应该synchronized(content)
,这是所有Hashtable
方法同步的。
同样,对(Object)的演员表明,写这篇文章的人只阅读了Java书的封面。
这同样好:
private Hashtable content = new Hashtable();
public void deleteContent(Object key){
content.remove(key);
}
public Object getContent(Object key){
return content.get(key);
}
答案 3 :(得分:0)
如果通过不同的方法同时访问该哈希表,则必须同步检索或删除元素以防止并发修改!