本文共 1914 字,大约阅读时间需要 6 分钟。
可重入锁
下面通过代码来演示一下
package org.javaboy.juc;import java.util.concurrent.locks.ReentrantLock;/** * @Author: bai * @DateTime: 2020/6/7 21:02 */public class TestLock implements Runnable { int ticketNums = 10; private final ReentrantLock lock = new ReentrantLock(); // 定义lock锁 @Override public void run() { while (true) { try { lock.lock();// 显式加锁 if (ticketNums > 0) { try { Thread.sleep(100); // 模拟延时操作 System.out.println(Thread.currentThread().getName() + "::" + ticketNums--); } catch (InterruptedException e) { e.printStackTrace(); } } else { break; } } finally { lock.unlock(); // 显示解锁 } } } public static void main(String[] args) { TestLock testLock = new TestLock(); new Thread(testLock, "小明").start(); new Thread(testLock, "小李").start(); new Thread(testLock, "黄牛党").start(); }}
代码解释:首先我们模拟多人抢票的场景,首先规定票数只有10张,然后我们通过票数判断是否已经被购完。在没有加入 ReentrantLock 之前,我们模拟的这个抢票场景会出现数据不一致问题,然后我们通过定义 ReentrantLock 锁,通过 lock.lock() 方法来显式加锁,通过 lock.unlock() 方法来显式解锁。这样就可以保证我们的数据一致性问题。
注意:一般我们显示加锁和解锁建议写在try/catch块中,这样就算发生了异常,finall 块依旧能够执行,我们的锁也可以被释放。这样就保证了程序的最起码的健壮性。转载地址:http://tvqwi.baihongyu.com/