Java 如何使构造函数同步?

Java 如何使构造函数同步?,java,multithreading,synchronized,default-constructor,Java,Multithreading,Synchronized,Default Constructor,我有课 public CarSold{ static int count; CarSold(){count++;} // Other code } 现在,它正在多线程环境中运行。我读到构造函数不是隐式同步的 在这种情况下,有可能在count变量中没有正确的汽车销量 如何确保计数正确 我可以想出两种方法 使用synchronized(carsell.Class) 我可以使用原子整数 这2种方法能解决问题吗? 还有别的办法吗 谢谢。您不同步构造函数,这在语义上没有任何意义,您同步了对变量的

我有课

public CarSold{

static int count;

CarSold(){count++;}


// Other code
}
现在,它正在多线程环境中运行。我读到构造函数不是隐式同步的

在这种情况下,有可能在
count
变量中没有正确的汽车销量

如何确保计数正确

我可以想出两种方法

  • 使用
    synchronized(carsell.Class)
  • 我可以使用原子整数
  • 这2种方法能解决问题吗? 还有别的办法吗


    谢谢。

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

    在本例中,您要查找的是
    AtomicInteger

    "Now this is running in multithreading enviroment. And I read here that constructors are not implicitly syncronized."
    
    你可能已经明白了逻辑,但只是想再提一次。当您同步一个方法时,它可能是构造函数,它会在“this”对象上创建锁,该对象仍未初始化,如果您尝试同步构造函数,则为null。但您可以创建一个单独的实例对象,并在该对象上使用锁。您尝试使用的实例变量很可能还未初始化,因为锁也未初始化。在这种情况下,您将得到NP异常。 现在,重要的是Java6中的最终实例变量是线程安全的,所以用户可以使用最终对象来锁定构造函数

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

    Can this 2 approach solves the problem ?
    

    为什么第一种方法不起作用?我认为它会起作用,因为只有一个线程可以进入块中,在那里我将编写count++。@Raj:它会起作用。某种程度上。直到某个笨蛋决定在
    carsell.class
    上进行同步——这是完全合法的,但会导致所有想要创建
    carsell
    的东西等待。如果你想锁定,那么锁定一些私有的东西(最好是最终的)。比如通过创建私有对象变量?@Raj:没错。虽然在本例中,您还需要将其设置为
    静态。