ReentrantLock商业项目上运用示例
下文笔者讲述"ReentrantLock商业项目"应用示例分享,如下所示
ReentrantLock简介
`ReentrantLock`是Java中`java.util.concurrent.locks`包 提供一个可重入锁(Reentrant Lock)
ReentrantLock主要特性
1.可重入性: - 如果某个线程已经持有了 `ReentrantLock` 它可以再次获取该锁而不被阻塞。 - 例 如果一个方法调用另一个也需要同一把锁的方法,不会导致死锁。 2.公平性: - 可以选择是否启用公平锁。 公平锁会按照线程请求锁的顺序来分配锁, 而非公平锁则允许插队。 - 默认是非公平锁 可以通过构造函数参数`true`来 创建公平锁。 3.条件变量: - `ReentrantLock`提供`Condition`接口 可以替代 `Object` 的 `wait()` 和 `notify()` 方法 提供更精细的线程控制。 4.锁中断支持: -`ReentrantLock`支持中断操作 可以在等待获取锁的过程中响应中断。
ReentrantLock基本用法
创建和使用 `ReentrantLock` import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockExample { private final ReentrantLock lock = new ReentrantLock(); private int counter = 0; public void increment() { lock.lock(); try { counter++; } finally { lock.unlock(); } } public int getCounter() { return counter; } public static void main(String[] args) throws InterruptedException { ReentrantLockExample example = new ReentrantLockExample(); Thread t1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { example.increment(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 10000; i++) { example.increment(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("Counter: " + example.getCounter()); } } 使用公平锁 import java.util.concurrent.locks.ReentrantLock; public class FairReentrantLockExample { private final ReentrantLock fairLock = new ReentrantLock(true); private int counter = 0; public void increment() { fairLock.lock(); try { counter++; } finally { fairLock.unlock(); } } public int getCounter() { return counter; } public static void main(String[] args) throws InterruptedException { FairReentrantLockExample example = new FairReentrantLockExample(); Thread t1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { example.increment(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 10000; i++) { example.increment(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("Counter: " + example.getCounter()); } } 使用条件变量 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class ConditionExample { private final ReentrantLock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private boolean ready = false; public void await() throws InterruptedException { lock.lock(); try { while (!ready) { condition.await(); } // 执行某些操作 System.out.println("Condition is ready, proceeding..."); } finally { lock.unlock(); } } public void signal() { lock.lock(); try { ready = true; condition.signalAll(); } finally { lock.unlock(); } } public static void main(String[] args) throws InterruptedException { ConditionExample example = new ConditionExample(); Thread t1 = new Thread(() -> { try { example.await(); } catch (InterruptedException e) { e.printStackTrace(); } }); Thread t2 = new Thread(() -> { example.signal(); }); t1.start(); t2.start(); t1.join(); t2.join(); } }
ReentrantLock注意事项
1.确保在 `finally` 块中解锁: - 为了防止死锁,始终在 `finally` 块中释放锁。 2.避免滥用锁: - 锁的粒度应尽可能小, 以减少竞争和提高并发性能。 3.处理中断: - 在需要响应中断的场景下, 使用 `lockInterruptibly()` 方法来获取锁, 并捕获 `InterruptedException`。
示例代码
以下是一个综合示例,展示了如何使用 `ReentrantLock` 和 `Condition`: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockAndConditionExample { private final ReentrantLock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); private int counter = 0; public void increment() { lock.lock(); try { counter++; if (counter >= 10) { condition.signalAll(); // 通知所有等待的线程 } } finally { lock.unlock(); } } public void awaitUntilTen() throws InterruptedException { lock.lock(); try { while (counter < 10) { condition.await(); } // 执行某些操作 System.out.println("Counter reached 10, proceeding..."); } finally { lock.unlock(); } } public static void main(String[] args) throws InterruptedException { ReentrantLockAndConditionExample example = new ReentrantLockAndConditionExample(); Thread t1 = new Thread(() -> { for (int i = 0; i < 15; i++) { example.increment(); } }); Thread t2 = new Thread(() -> { try { example.awaitUntilTen(); } catch (InterruptedException e) { e.printStackTrace(); } }); t1.start(); t2.start(); t1.join(); t2.join(); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。