Java 同步静态变量的方法就足够了吗?

Java 同步静态变量的方法就足够了吗?,java,multithreading,synchronized,Java,Multithreading,Synchronized,对于这段代码,同步方法是否足够好?非常感谢 class{ private static VariableManager = new VariableManager(); ... static class VariableManager{ private Map<String, Integer> diffCases = new HashMap<String,Integer>(); private int count=0;

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

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

}

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

如果在其他地方使用了
count
diffcases
,则必须确保始终使用同一监视器(即,包含静态变量的类对象)同步访问。如果您“仅”读取变量,则也是如此

*请注意,您的代码包括:
diffcases.add(case)
。无法将
.add()
添加到地图。这是真的密码吗


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

解释它为什么不能按预期工作。尝试通过调试器运行代码。是否有其他代码访问该映射?还是数数?请您发布它好吗?记住:Hashtable是同步的,而HashMap不是。方法进程属于类吗?定义“足够好”。够做什么?这不是一个真正的问题。如何做到这一点,“考虑隐藏一个被设计成给线程安全访问的对象中的静态变量”?如果对计数和差异的修改是独立的并且不需要同步(例如最终一致性就足够了),你可以考虑使用并发图和AtomicInteger。这些类被设计为由多个线程同时使用。如果修改必须是同步的,请编写您自己的类,该类封装一个映射和一个整数,并提供(同步!)getter和一个修改方法,如
public synchronized add(case)
,该方法原子地放入映射并增加计数器。修改了设计。像这样吗?谢谢
         Thread e1 = new Thread(new EventThread(eventsArray, "e1"));
         e1.start();

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

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