如何让我的构造函数同步?

时间:2014-03-23 08:01:11

标签: java multithreading synchronized default-constructor

我上课了。

public CarSold{

static int count;

CarSold(){count++;}


// Other code
}

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

在这种情况下,我可能无法在count变量中获得正确的汽车数量。

确保计数正确的方法是什么?

我可以想到两种方式。

  1. 使用synchronized(CarSold.class)
  2. 在构造函数内部进行类级别锁定
  3. 我可以使用AtomicInteger。
  4. 这2种方法可以解决这个问题吗? 还有其他方法吗?

    感谢。

2 个答案:

答案 0 :(得分:3)

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

在这种情况下,您要寻找的是AtomicInteger

答案 1 :(得分:0)

"Now this is running in multithreading enviroment. And I read here that constructors are not implicitly syncronized."

你可能已经有了逻辑但只是想再次提及它。当你同步一个方法时,它可能是构造函数,它会在这个'这个'如果您尝试同步构造函数,则仍未初始化的对象和null。但是您可以创建单独的实例对象并对该对象使用锁定。机会是您尝试使用的实例变量,因为锁尚未初始化。在这种情况下,您将获得NP异常。 现在,重要的是来自Java 6的最终实例变量是线程安全的,因此使用可以使用最终对象来锁定构造函数。

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

Can this 2 approach solves the problem ?

是。