为了账号安全,请及时绑定邮箱和手机立即绑定

多线程死锁测试

多线程死锁测试

慕姐4208626 2019-03-01 11:12:15
package test; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; /** * Created by rhwayfun on 16-4-3. */ public class ThreadTest { private static DateFormat format = new SimpleDateFormat("HH:mm:ss"); public synchronized void tryOther(ThreadTest other) throws InterruptedException { System.out.println(Thread.currentThread().getName() + " enter tryOther method at " + format.format(new Date())); System.out.println(Thread.currentThread().getName() + " tryOther method is about to invoke other method at " + format.format(new Date())); other.other(); } public synchronized void other() throws InterruptedException { System.out.println(Thread.currentThread().getName() + " enter other method atatatatat " + format.format(new Date())); } public static void main(String[] args) throws InterruptedException { final ThreadTest d1 = new ThreadTest(); final ThreadTest d2 = new ThreadTest(); Thread t1 = new Thread(new Runnable() { public void run() { try { d1.tryOther(d2); } catch (InterruptedException e) { e.printStackTrace(); } } }, "threadA"); Thread t2 = new Thread(new Runnable() { public void run() { try { d2.tryOther(d1); } catch (InterruptedException e) { e.printStackTrace(); } } }, "threadB"); t1.start(); //让threadA先运行一秒 TimeUnit.SECONDS.sleep(1); t2.start(); } } 如上,随便找的产生死锁的代码,问题:TimeUnit.SECONDS.sleep(1);加上这行后,不存在死锁问题。sleep并不释放锁,为何这边死锁情况会消失。输出结果为:threadA enter tryOther method at 15:37:39threadA tryOther method is about to invoke other method at 15:37:39threadA enter other method atatatatat 15:37:39threadB enter tryOther method at 15:37:40threadB tryOther method is about to invoke other method at 15:37:40threadB enter other method atatatatat 15:37:40 注掉这行,正常死锁。输出结果为:threadB enter tryOther method at 15:37:10threadA enter tryOther method at 15:37:10threadB tryOther method is about to invoke other method at 15:37:10threadA tryOther method is about to invoke other method at 15:37:10
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

线程A拿到tryOther锁但是他还要得到other的锁
线程B拿到tryOther的锁但是他还要拿到other的锁
有可能A刚刚释放锁B也刚刚释放tryOther的锁.
此时但是他们同时都想要获取other的锁 此时谁也不让谁 发生死锁
解决方法让俩个线程不要同时去抢第二把锁.让A停一会
但是如果你把时间调成纳秒级别 多次尝试也会发生死锁
不建议这样预防死锁.如果并发量高的情况下.

查看完整回答
反对 回复 2019-03-01
?
jeck猫

TA贡献1909条经验 获得超7个赞

双方在争同一把锁,不会死锁啊

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 535 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信