利用synchronized解析死锁的一种形成方式

代码

import ...

public class Test{

private static Object o1=new Object();

private static Object o2=new Object();

public static void main(String[] args){

new Thread(

new Runnable(){

@override

public void run(){

synchronized(o1){

System.out.println("get o1");

try{Thread.sleep(100);}catch(ThreadInterruptException e){System.out.println(e.getMessage();}

}

synchronized(o2){System.out.println("get o2");}

}

).start();

new Thread(

new Runnable(){

@override

public void run(){

synchronized(o2){

System.out.println("get o2");

try{Thread.sleep(100);}catch(ThreadInterruptException e){System.out.println(e.getMessage();}

}

synchronized(o1){System.out.println("get o1");}

}

).start();

}

}

 

分析

在第一个线程开始睡眠的时候并没有释放锁,第二个线程后睡,所以第一个线程先醒,醒了以后不会释放锁,因为下述还是synchronized,它属于可重入锁,也就是说锁会从第一个资源过渡到第二个资源,只有请求到第二个资源的时候才会过渡锁。现在第二个线程醒了,同理它也不会释放锁,因为它下面也是synchronized,它也需要请求到资源以后过渡锁。死锁形成。

posted @ 2020-06-20 20:50  千与千寻_如是  阅读(100)  评论(0编辑  收藏  举报
价值决定认知,认知决定价值观