从头开始创建缓存时的 Java 和线程安全

标签 java multithreading

下面的代码线程安全吗?

private static HashMap<String, String> cache = null;

public static String getInfo(String key) {
    populateCache();

    return cache.containsKey(key) ? cache.get(key) : null;
}

private static void populateCache() {
    if (cache == null) {
        cache.put("hello", "world");

        // ... more population logic here
    }
}

如果不是,我该怎么做才能使其线程安全?

编辑:感谢您的回答,我将尝试 ConcurrentHashMap。然而,我错过了一些东西..我实际上在这里将一个单独的 Foo 类的对象传递给 getInfo() :

public static Bar getInfo(Foo object) {
    object.someProperty = concurrentHashMapCache.get('something');

    return Bar.createFromFoo(object);
}

只要不同的线程向 getInfo 传递不同的 Foo 对象,上面的代码就应该可以工作,对吧?

最佳答案

Java 中的 HashMap不是线程安全的。如果您想要线程安全版本,请使用 ConcurrentHashMap: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html

关于从头开始创建缓存时的 Java 和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19870027/

相关文章:

c# - Windows上的多线程

android - 应用程序可能在其主线程上做了太多工作

java - 无法使用 volatile 在线程之间共享列表值

java - AccessController.checkPermission 的奇怪行为

java - 计算字符串数组中的字母数?

java - GAE 启动动态实例来服务请求而不是使用空闲的常驻实例

java - 为什么 ArrayBlockingQueue 在队列满的时候还没有被阻塞

java - 信号量不起作用

Java:扩展 Thread 而不实现 run()

java - 计算文件中多组 int 值