JAVA死锁代码实例

所谓死锁,很多人知道就是两个现成互相等待对方占有的资源,而出现无限等待下去的情况,但是涉及到写代码的话不一定都能写出来,以下思路作为参考:

(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



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值