同步(this)阻止整个对象?[英] synchronized(this) blocks whole object?

问题描述

<块引用>

可能重复:
同步块与同步方法?

从这个问题的接受答案:In Java关键部分,我应该同步什么?我知道了

public synchronized void foo() {
    // do something thread-safe
}

和:

public void foo() {
    synchronized (this) {
        // do something thread-safe
    }
}

做同样的事情.但是在第一种情况下,我们只使对象的一个​​方法同步,而在第二种情况下,我们使整个对象无法访问.那么为什么这两个代码片段做同样的事情呢?

推荐答案

你好像在混东西.

首先

public synchronized void method() {
}

从同步的角度来看,等同于:

public void method() {
    synchronized (this) {
    }
}

已经提到了优点/缺点,并且各种重复提供了更多信息.

其次,

synchronized(someObject) {
    //some instructions
}

表示同步块中的指令不能由 2 个线程同时执行,因为它们需要获取 someObject 上的监视器才能执行此操作.(假设 someObject 是一个不会改变的最终引用).

在您的情况下,someObject 恰好是 this.

对象中未同步的任何代码仍然可以并发执行,即使 this 上的监视器由于正在运行同步块而被线程持有.换句话说, synchronized(this) 不会"锁定整个对象".它只防止 2 个线程同时执行同步块.

最后,如果你有两个 synchronized 方法(都使用 this 作为锁),如果一个线程 (T1) 获得 this 上的锁以执行这两个方法之一,则不允许其他线程执行这两种方法中的任何,因为它们需要获取 this 上的锁,该锁已由 T1 持有.

这种情况可能会在关键部分产生争用,在这种情况下,必须使用更细粒度的锁定策略(例如,使用多个锁).

本文地址:https://www.itbaoku.cn/post/978576.html