我上课了。
public CarSold{
static int count;
CarSold(){count++;}
// Other code
}
现在这是在多线程环境中运行的。我读here,构造函数不是隐式同步的。
在这种情况下,我可能无法在count
变量中获得正确的汽车数量。
确保计数正确的方法是什么?
我可以想到两种方式。
synchronized(CarSold.class)
这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 ?
是。