JAVA死锁代码实例

来源:互联网 发布:十四阿哥和四阿哥知乎 编辑:程序博客网 时间:2024/05/19 02:20
所谓死锁,很多人知道就是两个现成互相等待对方占有的资源,而出现无限等待下去的情况,但是涉及到写代码的话不一定都能写出来,以下思路作为参考:

(1)创建两个线程,分别持有两个lock,比如是lock1和lock2

(2)线程1和线程2在run方法里分别先获取lock1和lock2的锁,之后分别sleep一段时间(避免一上来一个线程就获得了两个锁),然后线程1和线程2分别尝试去获取lock2和lock1

(3)此时因为锁已经被对方占有,并且对方还在等待自己持有的锁,这个时候死锁就发生了,代码如下:

import java.util.concurrent.locks.ReentrantLock;/** * Created by guishengran on 2017/8/18. */class Task1 implements Runnable{    private ReentrantLock lock1;    private ReentrantLock lock2;    public Task1(ReentrantLock lock1,ReentrantLock lock2){        this.lock1 = lock1;        this.lock2 = lock2;    }    @Override    public void run() {        lock1.lock();        try{            System.out.println("Task1 get lock1,start sleep...");            try {                Thread.sleep(500);            } catch (InterruptedException e) {                e.printStackTrace();            }            lock2.lock();            System.out.println("task1:You can never see me...because we are waiting each other T_T ");        }finally {            lock2.unlock();            lock1.unlock();        }    }}class Task2 implements Runnable{    private ReentrantLock lock1;    private ReentrantLock lock2;    public Task2(ReentrantLock lock1,ReentrantLock lock2){        this.lock1 = lock1;        this.lock2 = lock2;    }    @Override    public void run() {        lock2.lock();        try{            System.out.println("Task2 get lock2,start sleep...");            try {                Thread.sleep(500);            } catch (InterruptedException e) {                e.printStackTrace();            }            lock1.lock();            System.out.println("task2:You can never see me...because we are waiting each other T_T ");        }finally {            lock1.unlock();            lock2.unlock();        }    }}public class DeadLockTest {    private static ReentrantLock lock1 = new ReentrantLock();    private static ReentrantLock lock2 = new ReentrantLock();    public static  void main(String[] args){//        DeadLockTest testObj = new DeadLockTest();        Thread task1 = new Thread(new Task1(lock1,lock2));        Thread task2 = new Thread(new Task2(lock1,lock2));        task1.start();        task2.start();    }}

运行结果如下:

Task1 get lock1,start sleep...Task2 get lock2,start sleep...Process finished with exit code 1



原创粉丝点击