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

如何阻止同步方法死锁

任繁
2023-03-14

如果我们有一个synchronized方法,在使用同一个对象时需要进行同步,那该怎么做呢?

例如,我们有一个 transferMoney() 同步函数,如果所有参数在不同的调用中都不同,则可以并行执行,但如果调用 1 中的参数与调用 2 中的参数相同,则不能并行执行:

public synchronized transferMoney(Account a, Account b, float value){
    synchronized(a){
        synchronized(b){
            transfer();
        }
    }
}

如果(a, b)(b, a)同时调用函数,我们将如何停止这里的死锁?

我认为ab是易失性的,或者基于ab的哈希值进行同步,或者通过包含ab的新对象进行同步。

共有1个答案

师野
2023-03-14

如果(a, b)(b, a)同时调用函数,我们将如何停止这里的死锁?

如果一个线程有可能以与另一个线程相反的顺序进入同步块,这将是一种灾难。

为了避免死锁,每个方法中的监视器对象的顺序应该相同。一、 e.a-

 类似资料:
  • 问题内容: 从已接受的答案回答这个问题:在Java关键部分中,应该同步什么? 我了解到 和: 做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作? 问题答案: 您似乎在混合事物。 首先 从同步角度看,它等效于: 优点/缺点已被提及,各种重复项提供了更多信息。 其次, 意味着同步块中的指令不能由2个线

  • 问题内容: 我正在调试运行多个线程的Java应用程序。在查看日志一段时间后,似乎这些线程之一不再运行。我的猜测是线程正在等待永远不会释放的锁(最后的输出是在调用同步方法之前)。 我可以配置线程超时吗?一种“等待此锁,但如果10秒钟后仍不可用,请不要再等待!” 问题答案: 您可以使用java.util.concurrent.Lock代替内部锁。没有合理顺序的RentrantLock具有与内部锁相同的

  • 问题内容: 这个问题是面向jQuery的,但不一定是排他的。 简短的问题: 同步ajax调用会阻止正常按钮被单击吗? 我的测试表明这没有发生,但也许其他浏览器出了问题。 长的问题: 在我询问的另一个问题中,如何阻止ajax调用(我希望它阻止),这些家伙说浏览器在某些情况下会阻止。 实际上,甚至jQuery 的文档都说: 我正在尝试: 1.了解发生这种情况的方式/原因。 2.评估发生这种情况的可能性

  • 问题内容: 我发现经典的Java Deadlock Tutorial 中包含对System.out.format的调用将防止死锁的发生,我不知道为什么。 下面的代码是相同的教程,与除的 这是输出: 删除违规行会导致通常的死锁: 对System.out.format的调用是否以某种方式改变了线程获取对象内在锁的方式? 更新: 通过更改代码中启动线程的位置,我能够使系统再次陷入僵局: 这就引出了一个问

  • 我有一个无状态bean,它使用其他bean的异步方法插入一些数据(本地注入)。此数据插入需要一段时间,所以我不等待完成此操作。在此数据插入之后,我将调用相同bean的另一个方法。当我将调试点放置到方法时,server大约要等待90秒才能到达此点。可能是Jboss为异步方法等待事务完成。我不知道是怎么回事。. 我已经使用JStack创建了一个线程转储。实际上,我在Jboss As 6中没有这个问题。

  • 请看下面给我带来麻烦的方法: 然后是run方法: