首先看百度百科上的死锁的概念
死锁:死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力,他们都将无法推进下去。
此时成系统处于死锁状态,或者系统产生了死锁,这些永远在互相等待的进程成为死锁进程。
Java中的线程可以理解为一个小的独立的进程。
介绍完概念,下面我们来实现一个死锁。
public class Run { public static void main(String[] args) { String lock1="a"; String lock2="b"; new Thread(new Runnable() { @Override public void run() { try { synchronized (lock1) { System.out.println("A into lock1"); Thread.sleep(2000); synchronized (lock2) { System.out.println("A into lock2"); } } } catch (Exception e) { e.printStackTrace(); } } },"A").start(); new Thread(new Runnable() { @Override public void run() { try { synchronized (lock2) { System.out.println("B into lock2"); Thread.sleep(2000); synchronized (lock1) { System.out.println("B into lock1"); } } } catch (Exception e) { // TODO: handle exception } } },"B").start(); } }
控制台:
可以发现按钮是红色的,两个线程都未结束。此时我们可以使用jdk自带的工具来检测是否有死锁的现象。
首先进入cmd工具,在进入jdk的安装文件夹中的bin目录,执行jps命令,
得到运行的线程id是9548,在执行jstack命令 C:\Program Files\Java\jdk1.8.0_91\bin>jstack -l 9548,此处注意,是英文字母中L,而不是1
检测有死锁现象。
死锁是程序设计的Bug,在设计程序时要避免双方互相持有对方的锁的情况。本实验采用synchronized嵌套的代码接口来实现死锁,其实
不适用嵌套的synchronized代码结构也会出现死锁,与嵌套没有任何关系,不要被代码的结构所误导,知道互相等待对象释放锁就有可能出现死锁。
每一个优秀的人,都有一段沉默的时光。不抱怨,不诉苦,最后度过那段感动自己的日子。