【问题标题】:What if thread obtained a lock on object如果线程获得了对象上的锁怎么办
【发布时间】:2020-03-13 12:11:00
【问题描述】:

我经历了一次面试,遇到了一个问题,我对此感到有些困惑。
如果线程已经获得了对象的锁,其他线程是否可以在同一个对象上调用非同步方法?

【问题讨论】:

  • 是的,他们可以..
  • 如果我在面试中被问到这个问题,我会要求在白板上查看示例代码。如上所述,这个问题可以用不止一种方式来解释。
  • P.S.,我首先要指出,“同步方法”实际上只是主体为同步 block 的方法的语法糖。然后,我将只讨论同步块的行为,这更容易解释。

标签: java multithreading


【解决方案1】:

这个:

class SomeType {
    synchronized SomeOtherType Foobar() {...}
}

只是写这个的捷径:

class SomeType {
    SomeOtherType Foobar() {
        synchronized(this) {
            ...
        }
    }
}

还有这个:

class SomeType {
    static synchronized SomeOtherType Foobar() {...}
}

只是写这个的捷径:

class SomeType {
    static SomeOtherType Foobar() {
        synchronized(SomeType.class) {
            ...
        }
    }
}

因此,每个关于“同步方法”的问题都可以归结为一个关于同步块的问题。

你需要了解的关于同步块的大部分内容可以用两句话来概括:

  1. JVM 绝不允许两个线程在同一实例 synchronized (o) 上的块中同时执行 o,* 和
  2. 无论一个线程在退出synchronized (o) 块之前修改共享对象所做的任何事情,都保证在另一个线程进入在同一实例o 上同步的任何块时对另一个线程可见。

* 在 synchronized (o) 块内调用 o.wait() 会稍微复杂一些。 wait() 调用在它开始等待之前释放锁,然后在它返回之前重新获取锁。

从技术上讲,任何数量的线程都可以“进入”synchronized (o) 同一实例 o 的块中,只要其中一个线程在 o.wait() 调用中等待,但我更愿意说只有一个线程可以在同步块中执行,并且“等待”不算作“正在执行”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2010-09-21
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多