1

我知道 synchronized 关键字,但我想确保我有一个清晰的理解。

所以,如果我不使用 synchronized 关键字,一个实例变量可能会被两个线程覆盖,但如果我使用 synchronized 关键字,一次只能有 1 个线程进入该方法。对?

4

2 回答 2

2

如果我不使用 synchronized 关键字,一个实例变量可能会被两个线程覆盖

它不会被“覆盖”,但它可以由两个线程同时执行,如果它不是为处理这种情况而设计的,可能会导致不一致。

如果我确实使用 synchronized 关键字,一次只能有 1 个线程进入该方法。

如果您使用该方法,那是正确的synchronized:该关键字提供了一定数量的保证,包括互斥。

于 2013-01-26T07:09:30.940 回答
2

如果两个线程进入一个非同步的方法并更新一些共享状态,那么它可能会导致不一致。

public synchronized void method(){ 
      //only one thread will be able to enter (IF SAME INSTANCE)
}

但它也建立了一种先发生的关系。这是多线程的可见性部分。

两个动作可以通过happens-before关系排序。如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。

发生在JLS 之前。

于 2013-01-26T07:10:42.193 回答