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