gpt4 book ai didi

java - 同步器困惑

转载 作者:行者123 更新时间:2023-12-02 05:43:00 27 4
gpt4 key购买 nike

 class MutableInteger {

private int value;

public synchronized void increment() {
value++;
}

public synchronized int getValue() {
return value;
}

public void nonSync(){

}

}

我正在尝试了解同步关键字的工作原理。

我有一个类,其方法是同步的,这意味着在该对象的特定实例上,一次只有一个线程可以调用该方法?但这只适用于该方法吗?那么,如果线程 A 正在调用 increment,那么线程 B 必须等到线程 A 执行完该方法吗?但这只是一个逐个方法的基础?

但是,如果我这样做了

synchronized(this) {
//code
}

这会锁定对象的整个实例?

这有意义吗..我从本质上理解了它应该做什么,只是试图填补空白

最佳答案

你是对的,同步方法正在锁定实例本身。因此编写如下内容:

synchronized myMethod() {
//code
}

本质上与您编写的行为相同:

myMethod() {
synchronized(this) {
//code
}
}

请注意,this 只是一个对象,并用作锁,就像使用任何其他对象一样 - 该锁只能由一个线程在某一时刻拥有。此时,其他人必须等待它使用相同的对象进入同步块(synchronized block)。由于具有 synchronized 关键字的方法具有这样的行为方式,因此它们共享实例本身的锁。

因此,如果您有一个 increment()decrement() 方法都标记为 synchronized,那么只能使用这两个方法中的一个一次由一个线程使用。

同时,不带 synchronized 关键字的其他方法完全不受影响,并且无论是否有同步方法,其功能都相同。

关于java - 同步器困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56121430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com