package com.example.demo.hmjuc.day12;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author zhangqi
* @date 2022/5/12 12:14
*/
public class IntLock implements Runnable {
public static ReentrantLock lockl = new ReentrantLock();
public static ReentrantLock lock2 = new ReentrantLock();
int lock;
/**
* 控制加锁顺序,方便构造死锁
*
* @param lock
*/
public IntLock(int lock) {
this.lock = lock;
}
@Override
public void run() {
try {
if (lock == 1) {
lockl.lockInterruptibly();
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
lock2.lockInterruptibly();
} else {
lock2.lockInterruptibly();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
lockl.lockInterruptibly();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (lockl.isHeldByCurrentThread()) {
lockl.unlock();
}
if (lock2.isHeldByCurrentThread()) {
lock2.unlock();
}
System.out.println("线程" + Thread.currentThread().getName() + "执行完毕");
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new IntLock(1)).start();
Thread thread = new Thread(new IntLock(2));
thread.start();
Thread.sleep(500);
thread.interrupt();
}
}
ReentrantLock解决死锁
最新推荐文章于 2024-03-03 23:05:46 发布
这篇博客探讨了如何在Java中使用ReentrantLock来防止死锁。作者创建了一个IntLock类,该类实现了Runnable接口,并使用了两个ReentrantLock实例lock1和lock2。根据传入的参数,线程会按特定顺序获取锁,从而避免死锁的发生。在main方法中,启动了两个线程,其中一个线程在运行中途被中断,展示了如何中断持有锁的线程。
摘要由CSDN通过智能技术生成