只是不愿随波逐流 ...|

lidongdongdong~

园龄:2年7个月粉丝:14关注:8

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 的值,而不会相互阻塞

posted @   lidongdongdong~  阅读(23)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开