多线程更新静态数据的同步问题

在做一个程序,启动时从数据库读出静态数据存储到一个静态变量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的切换是原子操作,应该不会有同步问题。

如上实际是可以满足要求的,而且不会出现异常。我之前有这么用过,在现网运行了很长时间,没有出现过问题。