b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

如何避免Java线程中的死锁

电脑杂谈  发布时间:2020-03-20 17:13:08  来源:网络整理

线程死锁的原因_线程死锁_c++线程死锁

避免死锁是流行的Java面试问题之一. 即使这个问题看起来很基础,但是一旦您开始深入研究,大多数Java开发人员都会遇到麻烦. 那么什么是僵局?答案很简单线程死锁,当两个或多个线程互相等待以释放所需的资源并陷入无限等待时,这种情况称为死锁,并且仅在多任务或多线程情况下发生.

如何检测Java中的死锁?

线程死锁_c++线程死锁_线程死锁的原因

尽管对此可能有很多答案,但首先我将看一下代码,以了解嵌套的同步块是从另一个同步块中调用同步方法,还是试图锁定另一个对象. 如果真是这样,那么极有可能发生僵局. 确定死锁风险的另一种方法是在运行应用程序时实际遇到死锁. 如果发生这种情况,您可以尝试进行线程转储,在Linux中,可以使用命令“ kill -3”进行此操作. 这将在应用程序日志文件中打印所有线程的状态,您可以看到哪个线程被锁定在哪个对象上.

您可以使用诸如fastthread.io之类的工具分析线程,该工具允许您上载线程数据并进行分析. 另一种方法是使用jConsole / VisualVM. 它将准确显示哪些线程被锁定以及在哪个对象上发生了什么.

线程死锁的原因_线程死锁_c++线程死锁

编写将导致死锁的Java程序

一旦您回答了前面的问题,他们可能会问您如何编写将导致Java死锁的代码. 这是一种方法:

线程死锁的原因_线程死锁_c++线程死锁

如果两个或多个线程调用method1和method2,则可能发生死锁,因为如果线程1在执行方法1时获取了String对象的锁,而线程2获取了Integer的锁并在In中执行method2,两者都将互相等待以释放对Integer的锁定,而String继续执行,将永远无法工作.

如何避免Java中的死锁?您可以看到线程1要锁定由线程2持有的对象2,线程2要锁定由线程1持有的对象1. 由于没有线程愿意放弃,因此存在死锁,并且Java程序被卡住. 您应该知道使用常见并发模式的正确方法.

线程死锁_c++线程死锁_线程死锁的原因

如何避免Java中的死锁

现在,面试官已经走到最后线程死锁,这是最重要的问题之一. 我认为: 如何解决代码中的死锁?如果仔细查看上面的代码,您可能已经发现,死锁的真正原因不是多线程,而是它们请求锁的方式. 如果您提供有序访问,则问题将得到解决.

现在没有死锁,因为这两种方法都以相同的顺序访问Integer和String文本的锁. 因此,如果线程A获得了Integer对象的锁,则线程B将不会继续直到线程A释放整数锁;否则,线程B将不会继续. 即使线程B持有字符串锁,它也不会阻塞线程A,因为现程B不会期望线程A释放整数锁继续进行.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-146228-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...