对于这段代码,同步方法是否足够好?非常感谢。
class{
private static VariableManager = new VariableManager();
...
static class VariableManager{
private Map<String, Integer> diffCases = new HashMap<String,Integer>();
private int count=0;
public synchronized VariableManager get(){
return this.
}
public synchronized void add(String case, Integer i){
diffCases.put(case, i);
}
public synchronized void increment(){
c++;
}
}
}
public static synchronized void process(){
...
variableManager.add(case, num);
variableManager.count();
}
程序没有按预期工作,我怀疑这两个静态变量不以某种方式受到保护。当我使用一个线程时,它运行良好。
任何线索?非常感谢。
两个线程正在处理相同的事件数组,即'eventsArray'。在“process”方法中,两个变量在synchronized方法中被修改。
提供更多:
Thread e1 = new Thread(new EventThread(eventsArray, "e1"));
e1.start();
Thread e2 = new Thread(new EventThread(eventsArray, "e2"));
e2.start();
e1.join();
e2.join();
答案 0 :(得分:1)
为了保护静态变量的一致性必须使用相同的锁定同步对它们的访问权限。这包括阅读变量。如果静态变量仅用于您向我们展示的方法,那就足够了。
如果还有其他地方使用count
或diffcases
,则必须确保始终使用同一监视器(即包含静态变量的类对象)同步访问。如果您“只”阅读变量,情况也是如此。
*请注意,您的代码包括:diffcases.add(case)
。你不能.add()
到地图。那是真正的代码吗?
考虑将静态变量隐藏在一个对象中,该对象旨在授予对它们的线程安全访问,从而封装了并发感知代码。在线程之间共享静态变量通常是错误的来源。