• 线程死锁


    示例:

    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

  • 相关阅读:
    监听刷新
    判断当前日期是否在[startDate, endDate]区间
    精确计算工具类,提供加减乘除的计算
    常用正则表达式
    高并发
    递归案例
    序列化和反序列化
    web安全
    复杂跨域之CorsFilter源码分析
    springMVC访问根路径问题
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608365.html
Copyright © 2020-2023  润新知