8、读写锁 ReadWriteLock
1、示例代码
public class SharedLockExample { private static ReadWriteLock lock = new ReentrantReadWriteLock(); private static int sharedData = 0; public static void readData() { lock.readLock().lock(); try { System.out.print(Thread.currentThread() + " "); System.out.println("Read data: " + sharedData); } finally { lock.readLock().unlock(); } } public static void writeData(int data) { lock.writeLock().lock(); try { sharedData = data; System.out.print(Thread.currentThread() + " "); System.out.println("Write data: " + sharedData); } finally { lock.writeLock().unlock(); } } public static void main(String[] args) { // 创建多个读线程和一个写线程 Thread writerThread = new Thread(() -> { for (int i = 0; i < 5; i++) { writeData(i); // 写线程 } }); Thread readerThread1 = new Thread(() -> { for (int i = 0; i < 5; i++) { readData(); // 读线程 1 } }); Thread readerThread2 = new Thread(() -> { for (int i = 0; i < 5; i++) { readData(); // 读线程 2 } }); // 启动线程 writerThread.start(); readerThread1.start(); readerThread2.start(); // 等待线程执行完成 try { writerThread.join(); readerThread1.join(); readerThread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }
2、解释
读锁是共享锁,写锁是排它锁,读锁和写锁之间也是排它的
读操作可以并发执行,写操作只能单独执行,写操作和读操作之间不行并发执行
读锁的目的是:确保在读取共享资源时,不会被其他线程的写操作所干扰
如果代码中只有读操作,而没有写操作,那么就不存在竞争条件,不会出现数据不一致的情况
在这种情况下,可以省略对共享资源的读锁获取和释放操作,从而减少锁的开销,提高程序的性能
读锁是共享锁,多个线程可以同时获取读锁,readerThread1 和 readerThread2 可以同时获取读锁,因此它们可以同时读取 sharedData 的值,而不会相互阻塞
本文来自博客园,作者:lidongdongdong~,转载请注明原文链接:https://www.cnblogs.com/lidong422339/p/17488952.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步