【问题标题】:Synchronizing multiple blocks within same method [duplicate]在同一方法中同步多个块[重复]
【发布时间】:2020-07-05 08:40:22
【问题描述】:

假设我在一个方法中同步了两部分代码。所以 block1 和 block2 周围都有关键字 'synchronized',并且都使用 'this',这意味着两个块都被同一个对象锁保护。

现在如果block1正在被一个线程执行,是否意味着没有其他线程可以执行block2?

【问题讨论】:

  • 是的。 [填充文字]
  • 一个且只有一个同步方法可以在给定时间运行。对另一个同步方法的调用必须等到第一个方法完成。
  • @Amitkumar 这不正确,也没有回答问题。谁可以执行synchronized 块或方法取决于正在同步的对象。
  • 最后我读到,当一个类中有多个同步方法(静态和实例)时,Java 一次只允许一个这样的方法运行。
  • @Amitkumar 这不是它的工作原理。一个非静态同步方法,在一个实例上同步,所以多个非静态同步方法不能同时运行在同一个对象上,但可以运行在不同 对象。非静态同步方法等效于整个方法体上的synchronize(this) {...}。静态同步方法在类上同步,所以同一个类上的多个静态同步方法不能同时运行。静态同步方法不会阻塞非静态同步方法,反之亦然。

标签: java multithreading synchronized


【解决方案1】:

方法声明上的同步是一样的:

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

话虽如此,正如您在oracle docs 中看到的那样,您可以看到一个带有一些同步方法的示例,它说:

首先,同一对象上的同步方法的两次调用不可能交错。当一个线程正在为一个对象执行同步方法时,所有其他为同一对象调用同步方法的线程都会阻塞(暂停执行),直到第一个线程处理完该对象。

所以,是的,在这种情况下,没有其他线程可以执行 block2。

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2016-09-21
    相关资源
    最近更新 更多