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

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

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

如果两个或多个线程调用method1和method2,则可能发生死锁,因为如果线程1在执行方法1时获取了String对象的锁,而线程2获取了Integer的锁并在In中执行method2,两者都将互相等待以释放对Integer的锁定,而String继续执行,将永远无法工作.
如何避免Java中的死锁?您可以看到线程1要锁定由线程2持有的对象2,线程2要锁定由线程1持有的对象1. 由于没有线程愿意放弃,因此存在死锁,并且Java程序被卡住. 您应该知道使用常见并发模式的正确方法.

如何避免Java中的死锁
现在,面试官已经走到最后线程死锁,这是最重要的问题之一. 我认为: 如何解决代码中的死锁?如果仔细查看上面的代码,您可能已经发现,死锁的真正原因不是多线程,而是它们请求锁的方式. 如果您提供有序访问,则问题将得到解决.
现在没有死锁,因为这两种方法都以相同的顺序访问Integer和String文本的锁. 因此,如果线程A获得了Integer对象的锁,则线程B将不会继续直到线程A释放整数锁;否则,线程B将不会继续. 即使线程B持有字符串锁,它也不会阻塞线程A,因为现程B不会期望线程A释放整数锁继续进行.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-146228-1.html
别找借口
#杨洋icon##杨洋2015金投赏##索尼h