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

在这种情况下,线程如何同时获取两个对象的锁?

邵飞白
2023-03-14
public void method(Type1 inst1, Type2 inst2) {
  synchronized(inst1) {
    synchronized(inst2) {
      //do something now
    }
  }
}

从这段代码中我可以理解,一个线程一旦进入方法,就获取inst1上的锁,然后获取inst2上的锁,而不释放inst1锁。我假设这两个对象都没有被其他线程锁定。< br>

  1. 如果一个线程一次只能获得一个对象的锁,并且在当前对象的锁被释放时只能拥有另一个锁,那么这段代码怎么可能是有效的,或者更确切地说,它是我认为我在某个地方看到的有效代码吗?
  2. 如果Type1和Type2是相同的呢?
  3. 如果我们使方法同步,考虑到它驻留在方法的参数类型以外的类中,会发生什么?

共有3个答案

微生高谊
2023-03-14

如果每次您需要获得这两个对象的锁,那么您的代码都不会有问题。

例如,如果您有两种方法

public void methodA(Type1 inst1, Type2 inst2) {
  synchronized(inst1) {
    synchronized(inst2) {
      //do something now
    }
  }
}

public void methodB(Type1 inst1, Type2 inst2) {
  //wrong
  synchronized(inst2) {
    synchronized(inst1) {
      //do something now
    }
  }
}

您有一个潜在的死锁问题,因为一个线程可以在inst1上获得锁并等待inst2的锁,而另一个线程在inst2上获得锁,并等待inst1上的锁。

袁英豪
2023-03-14

感谢@morgano和@Nick Holt,我了解到一个线程可以同时持有多个锁(不同的对象),或者在同一个对象上多次持有(使用同步获得的锁是隐式可重入的)。

仉洲
2023-03-14

1.如果一个线程一次只能获得一个对象的锁,并且在当前对象的锁被释放时只能拥有另一个锁,那么这段代码怎么可能是有效的,或者更确切地说,它是我认为我在某个地方看到的有效代码吗?

它是一个有效的代码,锁不在方法所在的对象上,而是在 inst1 和 inst2 上。此外,锁不在类上,而是针对每个对象

1 米如果 Type1 和 Type2 相同呢?

同样,锁在对象上,而不是在类上。如果inst1和inst2相同,那么线程只有一个锁,同一个线程“重新进入”锁是有效的

3 .如果我们使方法同步,考虑到它驻留在方法的参数类型以外的类中,会发生什么?

然后,您还有另一个锁,这次是在执行方法的对象(而不是类)上。

 类似资料:
  • 这是我的建筑。格雷德尔: 我试图找出问题所在,使用以下代码来分析问题: 结果是:

  • 我在使用fs.readfile进行同步时遇到了一个问题,他们没有在第一次初始化,如果我再次尝试请求,那么我就有结果了。我知道我可以用promise和我从Kriskowal找到一些有用的东西。我试过但没有成功。我不太明白如何实施它。如果有人能帮忙,我将永远感激。 代码:

  • 问题内容: 我正在尝试从mysql数据的foreach循环中调用所有值,并使用那里的值输入到另一个mysql select语句中。看下面我的代码。它只能收集一个值。我当时正在考虑使用第一个foreach循环包括整个部分,但是,因为foreach的值是独立的,因此我需要使用爆炸数组进行PDO准备。因此,最后,我想知道一种从外部foreach循环获取所有值的方法。欣赏。 问题答案: 如果您最后一个目的

  • 我正在实现一个排序列表类,在这个类中,我将对任何类型的对象进行排序,所以现在我想测试对象是否具有可比性, 我用这段代码覆盖了compareTo()方法:- 所以现在我需要给这些对象分配数字,像这样 但它总是给我一个例外:- 线程“main”中出现异常Java . lang . classcastexception:Java . lang . integer不能转换为java.lang.String

  • 事件处理程序添加到GameGui.java类的GridPane中,从第82行开始。 基本上,我试图找到您在网格窗格中拖动这个对象的任何节点的索引。通过将SetonMouseEnter应用到gridpane中的每个节点,我可以在不拖动的情况下完成这一任务,但是当我试图利用SetonMouseDragEnter时,我什么也没有得到。 有人有办法让这个工作吗? 这些是我应用于GridPane中节点的事件

  • 我创建了龙卷风服务器,它接受python和matlab代码并执行它。这是服务器代码。 我用来访问的客户代码是,这里 我关心的是保持执行的顺序,这样python代码只有在matlab完成后才能执行。我使用jupyter_client来执行matlab/python代码。我在这里使用python27。问题是当我提交代码时,它抛出< code > type error:' NoneType ' obje