0

下面的代码线程安全吗?

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);
}

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

4

3 回答 3

3

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

于 2013-11-08T23:02:16.463 回答
2

它不是。使用ConcurrentHashMap或使公共方法同步(这更有意义,因为您在创建 HashMap 时也有竞争条件)。

于 2013-11-08T23:02:50.373 回答
0

很大程度上不仅取决于类的编写方式,还取决于它的使用方式。

您有一个共享的可变字段,它构成了您的类对象的状态。

cache在没有任何尝试同步访问的情况下填充,因此在并发环境中两个客户端线程可能同时进行修改cache

在没有任何内部同步的情况下,这个类看起来不安全。

于 2013-11-08T23:04:49.520 回答