大佬教程收集整理的这篇文章主要介绍了ReentrantLock 基本使用,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
java.util.concurrent
并发工具包下的一个重要工具类,相对于 synchronized 它具备如下特点:
public class SharedObject {
ReentrantLock lock = new ReentrantLock();
public void perform() {
// 获取锁
lock.lock();
try {
// 临界区
} finally {
// 释放锁
lock.unlock();
}
}
}
ReentrantLock#lock()
方法和 synchronized 获取锁的时候是一样的,会一直等待(不可打断)直到获取了锁;而可打断的意思是说,打断你获取锁;就是说不用你获取锁了。
@H_489_0@如果你允许获取锁的时候被被人打断,那么可以使用 ReentrantLock#lockInterruptibly()
方法获取锁。当别的线程调用了 interrupt() 方法时,该方法就会抛出异常。
ReentrantLock lock = new ReentrantLock();
Thread t1 = new Thread(() -> {
log.debug("启动...");
try {
lock.lockInterruptibly();
} catch (InterruptedException E) {
e.printStackTrace();
log.debug("等锁的过程中被打断");
return;
}
try {
log.debug("获得了锁");
} finally {
lock.unlock();
}
}, "t1");
lock.lock();
log.debug("获得了锁");
t1.start();
try {
sleep(1);
t1.interrupt();
log.debug("执行打断");
} finally {
lock.unlock();
}
@H_489_0@指的注意的是:tryLock(..) 也是支持可中断的。
ReentrantLock lock = new ReentrantLock();
Thread t1 = new Thread(() -> {
log.debug("启动...");
if (!lock.tryLock()) {
log.debug("获取立刻失败,返回");
return;
}
try {
log.debug("获得了锁");
} finally {
lock.unlock();
}
}, "t1");
lock.lock();
log.debug("获得了锁");
t1.start();
try {
sleep(2);
} finally {
lock.unlock();
}
ReentrantLock lock = new ReentrantLock(false);
lock.lock();
for (int i = 0; i < 500; i++) {
new Thread(() -> {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " running...");
} finally {
lock.unlock();
}
}, "t" + i).start();
}
// 1s 之后去争抢锁
Thread.sleep(1000);
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " start...");
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " running...");
} finally {
lock.unlock();
}
}, "强行插入").start();
lock.unlock();
static ReentrantLock lock = new ReentrantLock();
static Condition waitCigaretteQueue = lock.newCondition();
static Condition waitbreakfastQueue = lock.newCondition();
static volatile Boolean hasCigrette = false;
static volatile Boolean hasBreakfast = false;
public static void main (String[]args){
new Thread(() -> {
try {
lock.lock();
while (!hasCigrettE) {
try {
waitCigaretteQueue.await();
} catch (InterruptedException E) {
e.printStackTrace();
}
}
log.debug("等到了它的烟");
} finally {
lock.unlock();
}
}).start();
new Thread(() -> {
try {
lock.lock();
while (!hasBreakfast) {
try {
waitbreakfastQueue.await();
} catch (InterruptedException E) {
e.printStackTrace();
}
}
log.debug("等到了它的早餐");
} finally {
lock.unlock();
}
}).start();
sleep(1);
sendBreakfast();
sleep(1);
sendCigarette();
}
private static void sendCigarette () {
lock.lock();
try {
log.debug("送烟来了");
hasCigrette = true;
waitCigaretteQueue.signal();
} finally {
lock.unlock();
}
}
private static void sendBreakfast () {
lock.lock();
try {
log.debug("送早餐来了");
hasBreakfast = true;
waitbreakfastQueue.signal();
} finally {
lock.unlock();
}
}
@H_489_0@也就是可以创建多个 Condition,将线程放入不同的 Condition 中进行等待,可以随机唤醒 Condition 中的一个线程或唤醒所有线程。以上是大佬教程为你收集整理的ReentrantLock 基本使用全部内容,希望文章能够帮你解决ReentrantLock 基本使用所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。