什么是可重入锁和不可重入锁?
出现的问题
lock.lock();//第一行获取锁
{
lock.lock();//第三行,这一行会等待上一行的锁释放锁,才能获取成功,第一行的锁要运行到第六行才能释放
lock.unlock();//第四行,释放第三行锁
}//这是一个代码块,一般是调用别人的方法,我们不能确定别人的方法中有没有申请这个锁
lock.unlock();//第六行,释放第一行锁
引入可重入锁
lock.lock();//第一行获取锁
{
lock.lock();//第三行,这一行会判断是同一个线程,同样也可以获取锁,不会等待第一行锁释放
lock.unlock();//第四行,释放第三行锁
}//这是一个代码块,一般是调用别人的方法,我们不能确定别人的方法中有没有申请这个锁
lock.unlock();//第六行,释放第一行锁
实现思路和DEMO代码
不可重入锁
/**
* 不可重入锁
*
*/
public static class UnReLock {
private volatile boolean isLocked = false;
Thread lockedBy = null; //记录当前获取锁线程
public synchronized void lock() throws InterruptedException {
Thread thread = Thread.currentThread();
while (isLocked) {
wait();
}
isLocked = true;
lockedBy = thread;
}
public synchronized void unlock() {
if (Thread.currentThread() == this.lockedBy) {
isLocked = false;
lockedBy = null;
notify();
}
}
}
可重入锁
/**
* 可重入锁
* @author chenlinhui
*
*/
public static class ReLock {
volatile boolean isLocked = false; //记录锁状态
volatile Thread lockedBy = null; //记录当前获取锁线程
volatile int lockedCount = 0; //记录计数器
public synchronized void lock() throws InterruptedException {
Thread thread = Thread.currentThread();
while (isLocked &&( lockedBy != thread)) {
//已加锁,且不是同一个线程,需要等待
wait();
}
isLocked = true;
lockedCount++;//锁次数+1
lockedBy = thread;
}
public synchronized void unlock() {
if (Thread.currentThread() == this.lockedBy) {
lockedCount--;//锁次数减一
if (lockedCount == 0) { //锁次数为0,说明所有锁被释放
isLocked = false;
lockedBy = null;
notify();
}
}
}
}
验证
public class TestUnReLock {
static ReLock lockObject = new ReLock(); //测试可重入锁
//static UnReLock lockObject = new UnReLock(); //打开注解测试不可重入锁
/**
*我们自己写的方法
*/
public static void methodA_1() throws InterruptedException {
lockObject .lock();
System.out.println("methodA_1,获取锁。。。。");
methodB_1();//调用别人实现的方法
lockObject.unlock();
System.out.println("methodA_1,释放锁成功了");
}
/**
*可能是别人的不可修改的接口或方法
*/
public static void methodB_1() throws InterruptedException {
System.out.println("methodB_1,等待锁。。。。");
lockObject .lock();
System.out.println("methodB_1,我获取锁成功了");
lockObject .unlock();
System.out.println("methodB_1,释放锁成功了");
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException, InterruptedException {
methodA_1();
}
可重入锁结果,执行成功
methodA_1,获取锁。。。。
methodB_1,等待锁。。。。
methodB_1,我获取锁成功了
methodB_1,释放锁成功了
methodA_1,释放锁成功了
不可重入锁结果:无限等待
methodA_1,获取锁。。。。
methodB_1,等待锁。。。。
文章转载自小兀军,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




