• 多线程 死锁


      

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

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

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

      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 FilesJavajdk1.8.0_91in>jstack -l 9548,此处注意,是英文字母中L,而不是1

     检测有死锁现象。

      死锁是程序设计的Bug,在设计程序时要避免双方互相持有对方的锁的情况。本实验采用synchronized嵌套的代码接口来实现死锁,其实

    不适用嵌套的synchronized代码结构也会出现死锁,与嵌套没有任何关系,不要被代码的结构所误导,知道互相等待对象释放锁就有可能出现死锁。

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

  • 相关阅读:
    4.Spring系列之Bean的配置1
    3.Spring系列之IOC&DI
    2.Spring系列之HelloWorld
    1.spring系列之简要概述
    SVN 安装与使用
    6.用CXF编写基于Spring的WebService
    5.webService拦截器
    4.CXF所支持的数据类型
    APP消息推送及疑问解答
    VMware安装CentOS
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/9417737.html
Copyright © 2020-2023  润新知