-1

对于这段代码,同步方法是否足够好?非常感谢。

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”。在“过程”方法中,两个变量在同步方法中被修改。

提供更多:

         Thread e1 = new Thread(new EventThread(eventsArray, "e1"));
         e1.start();

         Thread e2 = new Thread(new EventThread(eventsArray, "e2"));
         e2.start();

         e1.join();
         e2.join();
4

1 回答 1

1

为了保护静态变量的一致性,对它们的每次访问都必须使用相同的锁进行同步。这包括读取变量。如果静态变量仅用于您向我们展示的方法,那就足够了。

如果还有其他地方使用countdiffcases,您必须确保使用相同的监视器(即包含静态变量的类对象)始终同步访问。如果您“仅”读取变量,这也是正确的。

*请注意,您的代码包括:diffcases.add(case). 你不能.add()去地图。那是真正的代码吗?

考虑将静态变量隐藏在旨在授予线程安全访问权限的对象中,从而封装并发感知代码。在线程之间共享静态变量通常是错误的来源。

于 2013-04-13T16:04:10.833 回答