同步器混乱

时间:2019-05-14 00:22:33

标签: java synchronization synchronized

 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
}

那会锁定对象的整个实例吗?

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

1 个答案:

答案 0 :(得分:0)

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

synchronized myMethod() {
    //code
}

与您编写的内容基本相同:

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

请注意,this只是一个Object,并用作锁,就像将使用任何其他对象一样-锁一次只能由一个线程拥有,其他线程必须等待使其使用相同的对象输入synchronized块。由于具有synchronized关键字的方法的行为方式相同,因此它们共享实例本身的锁。

因此,如果您有一个都标记为increment()的{​​{1}}和decrement()方法,则只能使用两个线程中的任何一个,并且一次只能使用一个线程。

与此同时,其他没有synchronized关键字的方法仍然完全不受影响,并且无论它们周围是否存在同步方法,它们都将发挥相同的作用。