java多线程中死锁实例

来源:互联网 发布:hecras软件 编辑:程序博客网 时间:2024/05/19 01:07

手写死锁实例

实例来自书本

上次面试问道自己手写一个死锁实例,平时对于死锁概念和流程都蛮熟悉的,关键时候突然蒙了,所以还是要自己动手写啊!

**
*1.两个竞争的资源
*2.同一个类里面实例化两个Thread来对两个资源竞争
*3.在t1获取碗后先sleep()(dosleep()方法),将时间片交个t2来获取筷子
*3.t1来请求筷子,但是t2还没有释放,线程等待;执行t2请求碗,但是t1没有释放,所以最后两个线程将相互等待

public class TestDeadlock {    //竞争的资源    private String chopsticks = "筷子";    private String bowls = "碗";    public  void dolock(){        t1.start();        t2.start();    }   Thread t1 = new Thread(new Runnable(){       @Override       public void run() {                     String name = Thread.currentThread().getName();           System.out.println(name+"准备去拿碗...");           synchronized(bowls){               System.out.println(name+"拿到了碗");               dosleep(name);//在休息的时候,将进行另外一个线程               System.out.println(name+"准备去哪筷子");               synchronized(chopsticks){                   //没有执行到这里的话说明死锁了                   System.out.println(name+"拿到了筷子");                 }           }       }   });   Thread t2 = new Thread(new Runnable(){    @Override    public void run() {        String name = Thread.currentThread().getName();        System.out.println(name+"准备去拿筷子...");        synchronized(chopsticks){            System.out.println(name+"拿到了筷子");            dosleep(name);            System.out.println(name+"准备去哪碗");            synchronized(bowls){                System.out.println(name+"拿到了碗");            }        }    }   });    public void dosleep(String name){        try {            System.out.println(name+"拿到了,先休息一会儿");            Thread.sleep(1000);        } catch (InterruptedException e) {                        e.printStackTrace();        }    }}
原创粉丝点击