开发者

When to use synchronized

开发者 https://www.devze.com 2023-03-13 11:01 出处:网络
I\'m wondering what is the reason behind synchronizing the below code. I开发者_如何学编程 don\'t think deadlock could occur ?

I'm wondering what is the reason behind synchronizing the below code. I开发者_如何学编程 don't think deadlock could occur ?

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


I have no idea.

The implementation of Hashtable is already synchronized and the remove method does nothing if the key isn't in the table. So all synchronized blocks can be removed (also the containsKey check).


Maybe the lock is used elsewhere in the code and is there for a reason. (?)


There is a race condition between containsKey() and remove(). A lock avoid the race condition.

However its rather pointless becasue you can just call remove() alone.


You are correct -- if they were to synchronize it, they should do synchronized(content), which is what all Hashtable methods are synchronized on.

Also that cast to (Object) shows whoever wrote this has only read the cover of a Java book.

This is just as good:

private Hashtable content = new Hashtable();

public void deleteContent(Object key){
    content.remove(key);
}

public Object getContent(Object key){
    return content.get(key);
}


If that hashtable is being accessed by concurrently by different methods, retrieval or deleting of elements would have to be synchronized to prevent concurrent modification!

0

精彩评论

暂无评论...
验证码 换一张
取 消