j-- java代码dead code_Java并发编程 - 一个简单的死锁示例和死锁的检查

Java线程死锁是一个经典的多线程问题。因为不同的线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续完成。

1.死锁程序示例

创建类 DeadLockThread:

public class DeadLockThread implementsRunnable {private Object lock1 = newObject();private Object lock2 = newObject();privateString s;public voidsetS(String s) {this.s =s;

}

@Overridepublic voidrun() {if ("a".equalsIgnoreCase(s)) {synchronized(lock1) {

System.out.println(Thread.currentThread()+ " a 正在执行");try{

Thread.sleep(3000);

}catch(InterruptedException e) {

e.printStackTrace();

}synchronized(lock2) {

System.out.println("lock1 -> lock2 死锁未生效");

}

}

}if ("b".equalsIgnoreCase(s)) {synchronized(lock2) {

System.out.println(Thread.currentThread()+ " b 正在执行");try{

Thread.sleep(3000);

}catch(InterruptedException e) {

e.printStackTrace();

}synchronized(lock1) {

System.out.println("lock2 -> lock1 死锁未生效");

}

}

}

}

}

创建运行类 Main:

public classMain {public static void main(String[] args) throwsInterruptedException {

DeadLockThread deadLockThread= newDeadLockThread();

deadLockThread.setS("a");

Thread threadA= newThread(deadLockThread);

threadA.start();

Thread.sleep(200);

deadLockThread.setS("b");

Thread threadB= newThread(deadLockThread);

threadB.start();

Thread.sleep(200);

}

}

运行结果如下:

20191012204105264271.png

2.使用JDK自带工具做死锁后的检查

1.进入JDK安装文件夹中的bin目录,执行jps命令:

20191012204105425393.png

得到正在运行着的线程Main的id值是12295。

2.在执行 jstack -l 12295 命令,查看结果:

20191012204105538667.png

由此结果可知,程序有死锁的现象。

3.使用IDEA的FindBugs插件检查可能出现的死锁

右键测试代码所在的包,选择分析包内文件

20191012204105608975.png

分析结果如下:

20191012204105847241.png

This method calls Thread.sleep() with a lock held.

This may result in very poor performance and scalability, or a deadlock,since other threads may be waiting to acquire the lock.

It is a much better idea to call wait() on the lock, which releases the lock and allows other threads to run.

此方法调用thread.sleep(),并保留一个锁。

这可能会导致性能和可伸缩性非常差,或者出现死锁,因为其他线程可能正在等待获取锁。

最好对锁调用wait(),这样可以释放锁并允许其他线程运行。

死锁是程序设计的bug,在设计程序时要避免双方互相持有对方锁的情况。需要说明的是,本实验使用synchronized嵌套的代码结构来实现死锁,其实不使用嵌套的synchronized代码结构也会出现死锁,与嵌套不嵌套没有任何的关系。只要互相等待对方释放锁,就有可能出现死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值