java多线程 - ReadWriteLock锁
程序员文章站
2022-07-12 11:34:59
...
目录
1、ReadWriteLock思想
因为有些场景的数据是多读少写的,对于多读少写的场景,如果加锁太多,反而会降低效率。因此,针对这种读写环境,将读写操作分别加锁。读取的时候,多个线程在没有写入的时候可以同时获得锁;只允许一个线程写入。
即:
- 只允许一个线程写入(其他线程既不能写入也不能读取);
- 没有写入时,多个线程允许同时读(提高性能)。
2、ReadWriteLock
适用条件
- 对于同一个数据,有大量线程读取(多读),但仅有少数线程修改(少写)。
例如,一个论坛的帖子,回复可以看做写入操作,它是不频繁的,但是,浏览可以看做读取操作,是非常频繁的,这种情况就可以使用ReadWriteLock
。
3、计数器示例
public class Counter {
private final ReadWriteLock rwlock = new ReentrantReadWriteLock();
private final Lock rlock = rwlock.readLock();
private final Lock wlock = rwlock.writeLock();
private int[] counts = new int[10];
public void inc(int index) {
wlock.lock(); // 加写锁
try {
counts[index] += 1;
} finally {
wlock.unlock(); // 释放写锁
}
}
public int[] get() {
rlock.lock(); // 加读锁
try {
return Arrays.copyOf(counts, counts.length);
} finally {
rlock.unlock(); // 释放读锁
}
}
}
4、小结
使用ReadWriteLock
可以提高读取效率:
-
ReadWriteLock
只允许一个线程写入; -
ReadWriteLock
允许多个线程在没有写入时同时读取; -
ReadWriteLock
适合读多写少的场景。