ReentrantReadWriteLock示例代码简介
下文笔者讲述常见的ReentrantReadWriteLock示例代码,如下所示
1.定义`ReentrantReadWriteLock`和锁
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); private final ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock(); private final ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock(); private String data; - `rwLock`:创建一个 `ReentrantReadWriteLock` 实例。 - `readLock`:获取读锁。 - `writeLock`:获取写锁。 - `data`:共享资源,可以是任何数据结构。
2.读取数据
public String readData() { readLock.lock(); try { // 模拟读取操作 System.out.println(Thread.currentThread().getName() + " is reading data: " + data); return data; } finally { readLock.unlock(); } } - `readLock.lock()`:获取读锁。 - `try` 块:执行读操作。 - `finally` 块:确保读锁在任何情况下都能被释放。
3.写入数据
public void writeData(String newData) { writeLock.lock(); try { // 模拟写入操作 System.out.println(Thread.currentThread().getName() + " is writing data: " + newData); data = newData; } finally { writeLock.unlock(); } } - `writeLock.lock()`:获取写锁。 - `try` 块:执行写操作。 - `finally` 块:确保写锁在任何情况下都能被释放。
4.处理数据(锁降级)
public void processData() { writeLock.lock(); try { // 写操作 data = "Updated Data"; System.out.println(Thread.currentThread().getName() + " is writing data: " + data); // 降级为读锁 readLock.lock(); try { // 读操作 System.out.println(Thread.currentThread().getName() + " is reading data after writing: " + data); } finally { readLock.unlock(); } } finally { writeLock.unlock(); } } - 获取写锁: writeLock.lock(); - 执行写操作: data = "Updated Data"; System.out.println(Thread.currentThread().getName() + " is writing data: " + data); - 获取读锁: readLock.lock(); -执行读操作: System.out.println(Thread.currentThread().getName() + " is reading data after writing: " + data); -释放读锁: readLock.unlock(); -释放写锁: writeLock.unlock();
5.主方法
public static void main(String[] args) { SharedResource resource = new SharedResource(); // 写线程 Thread writerThread = new Thread(() -> { for (int i = 0; i < 5; i++) { resource.writeData("Data " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }, "WriterThread"); // 读线程 Thread readerThread1 = new Thread(() -> { for (int i = 0; i < 10; i++) { resource.readData(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }, "ReaderThread1"); Thread readerThread2 = new Thread(() -> { for (int i = 0; i < 10; i++) { resource.readData(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }, "ReaderThread2"); // 处理数据线程(锁降级) Thread processDataThread = new Thread(() -> { for (int i = 0; i < 5; i++) { resource.processData(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }, "ProcessDataThread"); writerThread.start(); readerThread1.start(); readerThread2.start(); processDataThread.start(); } -写线程:每隔1秒写入一次数据。 -读线程:每隔0.5秒读取一次数据。 -处理数据线程:每隔2秒执行一次 `processData` 方法, 展示锁降级的过程。
注意事项
1.锁降级顺序: -先获取写锁, 再获取读锁,最后释放写锁: writeLock.lock(); try { // 写操作 readLock.lock(); try { // 读操作 } finally { readLock.unlock(); } } finally { writeLock.unlock(); } 2.避免锁升级: -不能从读锁升级为写锁, 否则可能导致死锁。 -正确顺序:先获取写锁, 再获取读锁,最后释放写锁。 3.公平性选择: -公平锁:`new ReentrantReadWriteLock(true)` 使用公平锁。 -非公平锁:`new ReentrantReadWriteLock(false)` 或默认构造函数 `new ReentrantReadWriteLock()`使用非公平锁 4.锁粒度: -细粒度锁:将锁的粒度细化, 提高并发性能。 -粗粒度锁:适用于锁的粒度较大, 但可能降低并发性能。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。