ReadWriteLock
- ReadWriteLock维护了一对相关的锁,一个用于只读操作,一个用于写入操作。只要没有writer,读取锁可以由Reader线程同时保持,但写入锁是独占的。
- ReadWriteLock读取操作通常不会改变共享资源,但执行写入操作时,必须用独占方式来获取锁。对于读取操作占多数的数据结构。ReadWriteLock能提供比独占锁更高的并发性。而不是对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作。
- 接口的JDK源码
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
- demo
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();
}
}).start();
}
}
}
class ReadWriteLockDemo{
private int number = 0;
private ReadWriteLock lock = new ReentrantReadWriteLock();
public void get() {
lock.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " : " + number);
} finally {
lock.readLock().unlock();
}
}
public void set(int number) {
lock.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName());
this.number = number;
} finally {
lock.writeLock().unlock();
}
}
}
