ReentrantLock 使用
学习任何一项技能都是先从使用开始的,所以我们也不例外,咱们先来看下 ReentrantLock 的基础使用:
publicclass LockExample { // 创建锁对象 privatefinal ReentrantLock lock = new ReentrantLock(); public void method() { // 加锁操作 lock.lock(); try { // 业务代码...... } finally { // 释放锁 lock.unlock(); } } }
ReentrantLock 在创建之后,有两个关键性的操作:
- 加锁操作:lock()
- 释放锁操作:unlock()
ReentrantLock 中的坑
1.ReentrantLock 默认为非公平锁
很多人会认为(尤其是新手朋友),ReentrantLock 默认的实现是公平锁,其实并非如此,ReentrantLock 默认情况下为非公平锁(这主要是出于性能方面的考虑),比如下面这段代码:
import java.util.concurrent.locks.ReentrantLock; publicclass LockExample { // 创建锁对象 privatestaticfinal ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { // 定义线程任务 Runnable runnable = new Runnable() { @Override public void run() { // 加锁 lock.lock(); try { // 打印执行线程的名字 System.out.println("线程:" + Thread.currentThread().getName()); } finally { // 释放锁 lock.unlock(); } } }; // 创建多个线程 for (int i = 0; i < 10; i++) { new Thread(runnable).start(); } } }
以上程序的执行结果如下: