何时使用synchronized

时间:2011-06-17 08:47:54

标签: java

我想知道同步下面代码的原因是什么。我不认为会发生死锁吗?

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

4 个答案:

答案 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)

如果通过不同的方法同时访问该哈希表,则必须同步检索或删除元素以防止并发修改!