当前位置: 首页 > 知识库问答 >
问题:

当其他线程正在执行该类的静态同步方法时,线程是否可以获取该类实例的锁?

颛孙信厚
2023-03-14

假设我们有

class A {
    void m1() {
        synchronized (this) {
        }
        blah blah blah
        synchronized (this) {
        }
    }
}

我的疑问是,在执行blah blah时,当前正在执行的对象为o的线程会释放锁,此时如果其他对象为o线程获得了锁,就会出现死锁。那么,我们怎么能说我们应该尝试使用同步块而不是同步方法呢?

假设线程 t1 执行静态同步方法,该方法获取了一个类级锁,其他线程是否可以获取该类实例的锁来执行其他同步方法?

共有2个答案

祁增
2023-03-14

对对象上的同步完全独立于类上的同步

壤驷敏学
2023-03-14

执行“blah blah blah”时,当前正在执行的线程没有任何锁。另一个线程可能获得对象上的锁,但这不会导致死锁。第一个线程将简单地阻塞,直到另一个线程释放锁。

当线程A拥有锁1,但需要锁2,而线程B拥有锁2但需要锁1时,就会发生死锁。这在你的情况下不会发生。

类级锁与对象实例上的锁不同。因此,类级锁不会干扰另一个线程在对象上执行其他同步方法。

 类似资料:
  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 方法有一个有趣的属性,它将允许其他线程在被阻止时进入其同步块。例如(假设线程1首先运行): 线程1: 线程2: 线程 2 能够唤醒线程 1 的事实意味着线程 2 进入了同步块,即使其他某个线程位于同一对象的同步块中也是如此。这对我来说很好,但我想知道这是否只发生在或所有会使线程“等待”的方法()上。在我的情况下,我关心,因为如果行为与相同,它会破坏我的代码: 那么,多个线程是否可能因为join调用

  • 我有多个线程使用ElasticSearchClient,如下所述 据我所知,Singleton类是线程安全的,但我不确定如果多个线程开始执行Singleton类的同一方法会发生什么。这有副作用吗? 注意:我知道上面的singleton类不是反射和序列化安全的。

  • 我了解Class对象上的静态同步锁,以及Object实例上的非静态锁。 但是,在此问题的可接受答案中:同步块中的静态与非静态锁定对象 使用非静态锁定对象时: 线程1调用o1.foo() 线程2调用o1.foo(),将不得不等待线程1完成 线程3调用o2.foo(),它可以只继续,不介意线程1和2 为什么线程 3 可以继续而不考虑线程 1 和 2。线程 3 是否必须等待从线程 1 或 2 获取对象实

  • 问题内容: 可以使用函数来检索方案名称。有没有办法也可以使正在执行的步骤(在中)?我们预见在日志记录和报告中将使用此方法。 因此,对于上述情况,将在执行相应的步骤定义时返回。 问题答案: 我们通过将整个步骤作为参数包装到“步骤定义”中来解决此问题。换句话说,步骤 转换成 步骤定义实际上将接受与步骤对应的字符串参数