静态地图对象的同步访问
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
操作。
这是同步访问地图的正确方法吗?
或者,
- 使地图易变是否有用?
- 由于我需要排序方式的映射,所以我不能使用 ConcurrentHashMap。因为,它可能会改变顺序。有什么使用方法吗?
请大家指点一下。
谢谢
尼西特
如果需要对键进行排序,则不能使用 ConcurrentHashMap,但可以使用 ConcurrentSkipListMap,这可能比尝试自己处理所有并发要好。
我在将在多线程环境中使用的 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
操作。
这是同步访问地图的正确方法吗?
或者,
- 使地图易变是否有用?
- 由于我需要排序方式的映射,所以我不能使用 ConcurrentHashMap。因为,它可能会改变顺序。有什么使用方法吗?
请大家指点一下。
谢谢
尼西特
如果需要对键进行排序,则不能使用 ConcurrentHashMap,但可以使用 ConcurrentSkipListMap,这可能比尝试自己处理所有并发要好。