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

    示例:

    public class DeadLock {
    	public static void main(String[] args) {
    		A a = new A();
    		B b = new B();
    		
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (b) {
    					try {
    						Thread.sleep(3000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					synchronized (a) {
    						System.out.println("b lock before a");
    					}
    				}
    			}
    		}).start();
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (a) {
    					try {
    						Thread.sleep(3000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				
    					synchronized (b) {
    					}
    				}
    			}
    		}).start();
    	}
    	
    	static class A{
    	}
    	
    	static class B{	
    	}
    
    }
    

    运行后通过java visualvm 看到检测到死锁:

    Found one Java-level deadlock:
    =============================
    "Thread-1":
      waiting to lock monitor 0x0000000002a4e728 (object 0x00000007809cb220, a com.thread.threadlocal.DeadLock$B),
      which is held by "Thread-0"
    "Thread-0":
      waiting to lock monitor 0x0000000002a4d288 (object 0x00000007809c9eb0, a com.thread.threadlocal.DeadLock$A),
      which is held by "Thread-1"
    
    Java stack information for the threads listed above:
    ===================================================
    "Thread-1":
            at com.thread.threadlocal.DeadLock$2.run(DeadLock.java:36)
            - waiting to lock <0x00000007809cb220> (a com.thread.threadlocal.DeadLock$B)
            - locked <0x00000007809c9eb0> (a com.thread.threadlocal.DeadLock$A)
            at java.lang.Thread.run(Thread.java:748)
    "Thread-0":
            at com.thread.threadlocal.DeadLock$1.run(DeadLock.java:20)
            - waiting to lock <0x00000007809c9eb0> (a com.thread.threadlocal.DeadLock$A)
            - locked <0x00000007809cb220> (a com.thread.threadlocal.DeadLock$B)
            at java.lang.Thread.run(Thread.java:748)
    
    Found 1 deadlock.
    
    

    线程死锁出现的四个条件:
    上面示例就是其中一种互相等待对方释放锁的情况,下述博文详细介绍了死锁产生的原因以及避免死锁发生:
    https://blog.csdn.net/jyy305/article/details/70077042
    https://blog.csdn.net/ls5718/article/details/51896159

  • 相关阅读:
    [LeetCode]Binary Tree Level Order Traversal
    [LeetCode]Binary Tree Postorder Traversal
    Netty(六):NioServerSocketChannel源码解析
    Netty(五):ServerBootstrap启动流程
    Netty(四):AbstractChannel源码解析
    Netty(三):IdleStateHandler源码解析
    自定义fastjson对枚举类型的序列化及反序列化过程
    TCP连接过程及报文解析
    Netty(二):数据在ChannelPipeline中的流经
    Netty(一):ByteBuf读写过程图解
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608365.html
Copyright © 2011-2022 走看看