在做一个程序,启动时从数据库读出静态数据存储到一个静态变量HashMap中,
提供给多个线程进行读操作,然后每隔一段时间(比如30分钟)再次从数据库更新
数据到此HashMap中,这样的逻辑需要怎样的锁来实现呢?是否应该用读写锁?
另外如何才能提高效率,同时保证线程安全?如果存储数据的容器是List又如何
实现?
更新HashMap线程逻辑代码:
[code="java"]
public void updateData() {
// MyHashData就是存储静态数据HashMap<String, String>
// 是不是应该用ConcurrentHashMap?
// loadData是读取静态数据的函数,这样直接返回会不会有问题
// 是不是应该MyHashData直接调用put函数来读取数据?
// 如何加锁?
MyHashData = loadData();
}
[/code]
其他线程逻辑代码:
[code="java"]
public void checkData() {
// 如何加锁?
if (MyHashData.containsKey(key)) {
// 处理过程
...
}
}
[/code]
[quote]我也想过这样做,但是这样应该存在线程安全的问题吧,是不是应该加个锁?[/quote]
你的Map对于很多线程都是只读的,你只要保证重新更新Map的是由一个线程来处理
两个map的切换是原子操作,应该不会有同步问题。
1 获得一个线程安全的map
map = Collectiona.synchronizedMap(yourmap);
2 考虑使用ConcurrentMap
[quote]用了线程安全的map,也应该要加锁吧,我现在就是在想该怎么加锁比较好[/quote]
用来就不用加了。具体看Collections.synchronizedMap(map)的实现,其实就是对map的每个方法都加synchronized。
有更好的办法不用加锁。
先新建一个Map然后读取数据库中的数据。
然后直接将正在使用的map的引用指向新的map
然后删掉久的map
这样不用担心同步问题
你的Map对于很多线程都是只读的,你只要保证重新更新Map的是由一个线程来处理
两个map的切换是原子操作,应该不会有同步问题。
如上实际是可以满足要求的,而且不会出现异常。我之前有这么用过,在现网运行了很长时间,没有出现过问题。