深入理解ReentrantLock:公平锁与非公平锁机制解析

需积分: 0 0 下载量 66 浏览量 更新于2024-08-05 收藏 174KB PDF 举报
"这篇文档是关于Java中的ReentrantLock锁机制的,特别是公平锁与非公平锁的概念。文章通过创建一个自定义的MyReentrantLock类来扩展ReentrantLock,并探讨了如何设置公平锁和非公平锁的行为。文档中还使用了CountDownLatch工具类来协调多线程间的同步。” 在Java并发编程中,`ReentrantLock`是一种可重入、可中断、可公平的锁,相比`synchronized`关键字提供了更细粒度的控制。`ReentrantLock`的公平性意味着锁的获取遵循先进先出(FIFO)原则,所有等待获取锁的线程会按照它们请求锁的顺序依次获得锁。这与非公平锁形成对比,非公平锁的线程在尝试获取锁时可能会插队,即不严格按照等待顺序来。 `ReentrantLock`类提供了一个构造函数,允许我们指定是否启用公平锁策略。例如,在`MyReentrantLock`类中,构造函数通过传递`boolean fair`参数给父类`ReentrantLock`的构造函数,来设定锁的公平性: ```java public MyReentrantLock(boolean fair) { super(fair); // 是否开启公平锁 } ``` `getQueuedThreads()`方法被重写,返回一个按线程进入队列顺序排列的线程列表,以验证公平性的实现: ```java public Collection<Thread> getQueuedThreads() { List<Thread> arrayList = new ArrayList<>(super.getQueuedThreads()); Collections.reverse(arrayList); return arrayList; } ``` 文档中还使用了`CountDownLatch`工具类,这是一个在Java并发库中用于线程同步的计数器。`CountDownLatch`有一个计数值,线程在开始执行前会等待这个计数值变为0。当计数值减至0时,所有等待的线程可以继续执行。在测试公平锁与非公平锁的场景中,`CountDownLatch`可以帮助确保所有线程都在特定点开始尝试获取锁。 `Worker`类是实现工作线程的抽象,它继承自`Thread`类,用于模拟多个线程竞争锁的场景。这些线程会调用`lock()`方法尝试获取锁,然后执行任务,最后释放锁。 通过分析和实验,我们可以理解`ReentrantLock`在公平模式和非公平模式下的不同行为,以及在多线程环境中的性能和调度差异。公平锁确保了等待线程的公平性,但可能增加整体的同步开销,导致较低的吞吐量。而非公平锁虽然可能造成线程等待的不公平,但在大多数情况下能提供更高的并发性能。选择哪种模式取决于具体的应用需求和性能优化目标。