1

首先,我有以下(这里是简化的)类:

public class MyClass {

    private static Map<String, Object> objects = new HashMap<String, Object>();

    public static Object get(String key) {
        return objects.get(key);
    }

    public static void set(String key, Object object) {
        objects.put(key, object);
    }

}

然后,我想让它变得安全,所以我尝试了如下synchronized关键字:

public class MyClass {

    private static Map<String, Object> objects = new HashMap<String, Object>();

    public static synchronized Object get(String key) {
        return objects.get(key);
    }

    public static synchronized void set(String key, Object object) {
        objects.put(key, object);
    }

}

问题是,synchronized在我的情况下,关键字是否足够,或者是否有必要添加volatile一个,即:

public class MyClass {

    private static volatile Map<String, Object> objects = new HashMap<String, Object>();

    public static synchronized Object get(String key) {
        return objects.get(key);
    }

    public static synchronized void set(String key, Object object) {
        objects.put(key, object);
    }

}

?

4

3 回答 3

4

只有重新分配volatileobjects才会产生影响objects。在您的示例中,您没有这样做,因此它不会产生影响并且是不必要的。

请注意,通过设置objectsfinal 来强制执行“不可重新分配”是一种很好的做法。

在您的情况下,您可以简单地通过使用线程安全映射实现来委派线程安全(这肯定会比您的同步实现更好地扩展)。

于 2013-01-25T16:22:31.987 回答
3

volatile不会神奇地使您的代码线程安全,它只是为了防止 JVM 进行在多线程上下文中不相关的优化(或者更糟的是,阻止您的程序按预期运行)。

我建议您改为查看ConcurrentHashMap,它可能对您有用。

于 2013-01-25T16:24:08.453 回答
0

您不会更改存储在 中的引用,因此使用关键字objects没有任何价值。volatile

于 2013-01-25T16:22:36.853 回答