2018java面试进阶-多线程死锁手写案例及解决死锁方案

面试题1、什么情况下导致线程死锁,遇到线程死锁该怎么解决?(代码案例说明)

分析:所谓的线程死锁是指多个线程因竞争资源而造成的一种僵局(即相互等待),若无外力作用,这些进程都将无法向前推进。如下图产生线程死锁的一个例子:

2018java面试进阶-多线程死锁手写案例及解决死锁方案

面试题1:线程死锁案例

上图代码运行后,会处于线程o1等待线程o2,线程o2又等待线程o1释放资源,所以处于相互等待的状态,即程序也就产生线程死锁。那么如何解决才能避免死锁的产生呢?在有些情况下的死锁是可以避免的,两种用于避免死锁的技术:

1、加锁顺序(线程按照一定的顺序加锁),实现代码如下:

2018java面试进阶-多线程死锁手写案例及解决死锁方案

防止死锁

2018java面试进阶-多线程死锁手写案例及解决死锁方案

防止死锁运行效果图

防死锁的方式2:加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁),案例代码如下图:

2018java面试进阶-多线程死锁手写案例及解决死锁方案

解决线程死锁方式二

2018java面试进阶-多线程死锁手写案例及解决死锁方案

方式2运行效果图

2018java面试进阶-多线程死锁手写案例及解决死锁方案


分享到:


相關文章: