手写死锁程序实例
1.定义:死锁是指多线程为了争抢资源造成的互相等待现象,如果没有外力介入,无法进行下去
2.代码实现:
package com.yang.test; import java.util.concurrent.TimeUnit; /** * 死锁示例演示 * 死锁是指,多个线程同时争抢资源造成的相互等待现象,没有外力干预无法进行下去 * @author yang yajun * @date 2020/12/2921:16 */ public class DeadLockExample { public static void main(String[] arg0){ String str1="lockA"; String str2="lockB"; LockSource lockSource = new LockSource();
/**
* 开启2个线程执行execute方法,传入不同的参数,不同的对象,造成2个线程相互等待
*/
new Thread(()->{ try { lockSource.execute(str1,str2); } catch (InterruptedException e) { e.printStackTrace(); } },"AAA").start(); new Thread(()->{ try { lockSource.execute(str2,str1); } catch (InterruptedException e) { e.printStackTrace(); } },"BBB").start(); } } /** * 资源类 * @author yang yajun * @date 2020/12/29 21:19 */ class LockSource{ /** * 写一个方法,传入2个参数,先锁第一个后再尝试获取第二个锁, * 获取不到就等着 * @author yang yajun * @date 2020/12/29 21:23 */ public void execute(String str1, String str2) throws InterruptedException { synchronized (str1){ System.out.println(Thread.currentThread().getName()+"正在锁:"+str1+",要争抢:"+str2); TimeUnit.SECONDS.sleep(2); synchronized (str2){ System.out.println("dddddd"); } } } }
3.如何判断是死锁?——通过jstack命令查看栈信息 ,结果如下:两个线程相互等到,造成了deadlock,想要了解jstack的更多知识,请看我的另一篇博客,
https://www.cnblogs.com/yayin/p/14185197.html
jstack pid