ReadWriteLock读写锁
- ReadWriteLock维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有Writer,读取锁可以由多个reader线程同时保持。写入锁是独占的。
- ReadWriteLock读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock能提供比独占锁更高的并发性。而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
/** * @author chenpeng * @date 2018/7/11 8:03 * * 1、ReadWriteLock:读写锁 * 包含一对锁,其中读锁可以多线程操作,写锁是独占的 * 写写/读写:“互斥的” * 读读:不需要互斥 */ public class TestReadWriteLock {
public static void main(String[] args) {
ReadWriteLockDemo rw = new ReadWriteLockDemo();
//一个线程写
new Thread(new Runnable() {
@Override
public void run() {
rw.set((int) (Math.random()*101));
}
},"write:").start();
//多个线程读
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
rw.get();
}
},"read:").start();
}
}
}
class ReadWriteLockDemo {
private int num = 0;
private ReadWriteLock lock = new ReentrantReadWriteLock();
//读
public void get(){
lock.readLock().lock();//上锁
try {
System.out.println(Thread.currentThread().getName()+" : "+num);
} finally {
lock.readLock().unlock();
}
}
//写
public void set(int num){
lock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName();
this.num = num;
} finally {
lock.writeLock().unlock();
}
}
}