首先,我有以下(此处已简化)类:
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);
}
}
然后,我想让它成为treahsafe,所以我尝试了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);
}
}
答案 0 :(得分:4)
如果您重新分配objects
,那么objects
易变只会产生影响。在你的例子中你不这样做它不会有所作为,也没必要。
请注意,最好通过objects
最终来强制执行“不可重新分配”。
在您的情况下,您可以简单地使用a thread safe map implementation委派线程安全性(这肯定会比同步实现更好地扩展)。
答案 1 :(得分:3)
volatile
并没有神奇地使你的代码线程安全,只是在这里阻止JVM进行在多线程上下文中无关的优化(或者更糟糕的是,阻止你的程序按预期运行)。 / p>
我建议您先查看ConcurrentHashMap,它可能对您的情况有用。
答案 2 :(得分:0)
您没有更改objects
中存储的引用,因此使用volatile
关键字没有任何价值。