class MutableInteger {
private int value;
public synchronized void increment() {
value++;
}
public synchronized int getValue() {
return value;
}
public void nonSync(){
}
}
我正在尝试了解同步关键字的工作原理。
我有一个带有同步方法的类,这意味着在该对象的特定实例上,一次只能有一个线程可以调用该方法?不过这仅与该方法有关吗?那么,如果线程A调用了incriment,线程B是否必须等到线程A完成执行该方法之后?但这只是一个方法的基础吗?
但是,如果我做了
synchronized(this) {
//code
}
那会锁定对象的整个实例吗?
有道理..我本质上理解了这应该做什么,只是试图填补空白
答案 0 :(得分:0)
是的,同步方法正在锁定实例本身。 因此,编写以下内容:
synchronized myMethod() {
//code
}
与您编写的内容基本相同:
myMethod() {
synchronized(this) {
//code
}
}
请注意,this
只是一个Object
,并用作锁,就像将使用任何其他对象一样-锁一次只能由一个线程拥有,其他线程必须等待使其使用相同的对象输入synchronized
块。由于具有synchronized
关键字的方法的行为方式相同,因此它们共享实例本身的锁。
因此,如果您有一个都标记为increment()
的{{1}}和decrement()
方法,则只能使用两个线程中的任何一个,并且一次只能使用一个线程。
与此同时,其他没有synchronized
关键字的方法仍然完全不受影响,并且无论它们周围是否存在同步方法,它们都将发挥相同的作用。