zoukankan      html  css  js  c++  java
  • 多线程 死锁

      

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

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

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

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

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

  • 相关阅读:
    weex入门篇
    vue项目修改favicon
    IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法
    angularJS指令动态加载template
    angularJS的ng-repeat-start
    angular指令的详细讲解,不断补充
    实现输入框换行
    vue2.0实现一个模态弹框,内容自定义(使用slot)
    centos7 vnc 无法systemctl启动
    CentOS6.5配置rsyslog
  • 原文地址:https://www.cnblogs.com/hrlizhi/p/9417737.html
Copyright © 2011-2022 走看看