java - 同步器困惑

标签 java synchronization synchronized

 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/

相关文章:

java - Android - 从同步块(synchronized block)启动线程

java - Queue Worker Thread停止工作,线程安全问题?

java - 改进两次遍历数组(同一数组上的嵌套循环)

c++ - 任何实现多线程访问值而不需要读者锁定的方法

go - 取消引用指针的类型断言是 Go 中的内存写入吗?

java - 如何单独同步数据成员

java - 为什么 Unmarshaller 行为不一致?

java - Google Maps API Android - 膨胀类 fragment 时出错

ios - 同步下载 Firebase 存储

Java notify() 在 wait() 之前运行?