我知道 synchronized 关键字,但我想确保我有一个清晰的理解。
所以,如果我不使用 synchronized 关键字,一个实例变量可能会被两个线程覆盖,但如果我使用 synchronized 关键字,一次只能有 1 个线程进入该方法。对?
我知道 synchronized 关键字,但我想确保我有一个清晰的理解。
所以,如果我不使用 synchronized 关键字,一个实例变量可能会被两个线程覆盖,但如果我使用 synchronized 关键字,一次只能有 1 个线程进入该方法。对?
如果我不使用 synchronized 关键字,一个实例变量可能会被两个线程覆盖
它不会被“覆盖”,但它可以由两个线程同时执行,如果它不是为处理这种情况而设计的,可能会导致不一致。
如果我确实使用 synchronized 关键字,一次只能有 1 个线程进入该方法。
如果您使用该方法,那是正确的synchronized
:该关键字提供了一定数量的保证,包括互斥。
如果两个线程进入一个非同步的方法并更新一些共享状态,那么它可能会导致不一致。
public synchronized void method(){
//only one thread will be able to enter (IF SAME INSTANCE)
}
但它也建立了一种先发生的关系。这是多线程的可见性部分。
两个动作可以通过happens-before关系排序。如果一个动作发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。
发生在JLS 之前。