代码之家  ›  专栏  ›  技术社区  ›  Raj

如何使构造函数同步?

  •  1
  • Raj  · 技术社区  · 10 年前

    我有一节课。

    public CarSold{
    
    static int count;
    
    CarSold(){count++;}
    
    
    // Other code
    }
    

    现在这是在多线程环境中运行的。我读到了 here 构造函数没有隐式同步。

    在这种情况下,我很可能没有在 count 变量

    如何确保其计数正确?

    我能想到两种方法。

    1. 构造函数内部的类级锁定使用 synchronized(CarSold.class)
    2. 我可以使用AtomicInteger。

    这2种方法能解决问题吗? 还有别的办法吗?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   user177800 user177800    10 年前

    您不同步构造函数,这在语义上没有任何意义,而是同步对变量的访问。这可以从任何可以访问它的地方发生。

    在这种情况下,您需要的是 AtomicInteger .

        2
  •  0
  •   Mak    10 年前
    "Now this is running in multithreading enviroment. And I read here that constructors are not implicitly syncronized."
    

    你可能已经掌握了逻辑,但只想再提一次。当您同步一个方法(可能是构造函数)时,它会在“this”对象上创建锁,该对象仍然未初始化且为空,以防您尝试同步构造函数。但是您可以创建一个单独的实例对象,并对该对象使用锁。很可能是您试图使用的实例变量,因为锁也尚未初始化。在这种情况下,您将得到NP异常。 现在,重要的是来自Java6的最终实例变量是线程安全的,所以用户可以使用最终对象来锁定构造函数。

    如果您正在锁定XYD.class,那么它将是应用程序锁,这在您的情况下可能有效,但有时您需要实例级锁,在这种情况下,您可以使用上述方法。

    Can this 2 approach solves the problem ?