博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多线程 死锁

Posted on 2018-08-04 10:25  南国木棉  阅读(119)  评论(0编辑  收藏  举报

  

  首先看百度百科上的死锁的概念

  死锁:死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力,他们都将无法推进下去。

此时成系统处于死锁状态,或者系统产生了死锁,这些永远在互相等待的进程成为死锁进程。

  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代码结构也会出现死锁,与嵌套没有任何关系,不要被代码的结构所误导,知道互相等待对象释放锁就有可能出现死锁。

 

  每一个优秀的人,都有一段沉默的时光。不抱怨,不诉苦,最后度过那段感动自己的日子。