静态地图对象的同步访问

Synchronized Access of Static Map Object

我在将在多线程环境中使用的 Web 服务中使用静态地图对象。

private static Map<String, String> map;

地图以键值对的形式保存来自数据库的记录。因为,数据库很大,为每个请求执行读取操作将是一件代价高昂的事情。我在服务启动期间读取了地图对象中的完整数据库,并且由于所有对象都应该共享相同的记录,所以我将其声明为静态的。

static
{
      map = loadDatabase();
}

private Map<String,String> loadDatabase()
{   
    //database operations
    Map<String,String> sortedMap = new TreeMap<String,String>(new LengthBasedComparator());
    //put all records in a map in the length sorted manner
    return sortedmap            
}

我使用了 TreeMap 因为我希望它根据键的长度进行排序。这是使用 LenghBasedComparator class

完成的

如果它只是读取操作,它会工作得很好。

public String getStringMatch(String key)
{
   // additional processing
   map.get(key);
   // more processing
}

现在,出现了更新内存数据库即地图的新要求。

public String updateInMemoryDatabase(String key, String value)
{
    //....
    synchronized(map)
    {
       map.put(key,value);
    }
    return SUCCESS;
   //......
}

我在地图上的 synchronized 块中放置了 put 操作。

这是同步访问地图的正确方法吗?

或者,

  1. 使地图易变是否有用?
  2. 由于我需要排序方式的映射,所以我不能使用 ConcurrentHashMap。因为,它可能会改变顺序。有什么使用方法吗?

请大家指点一下。

谢谢

尼西特

如果需要对键进行排序,则不能使用 ConcurrentHashMap,但可以使用 ConcurrentSkipListMap,这可能比尝试自己处理所有并发要好。