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/