读写锁:ReadWriteLock
1. 什么是读写锁
我们在使用锁时,通常对共享数据直接加锁,虽然保证了数据访问的安全,但是性能其实也是比较低下的。所以,除了了降低锁的粒度之外,我们还是希望可以有其他更好的一些实现。
首先分析下锁的使用场景:
写写、读写 需要“互斥”
读读 不需要互斥
所以,读写锁是维护了一对锁,一个读锁,一个写锁。读锁允许多个线程同时访问,只要没有写线程时;写锁是独占的。正好就是上面场景,只要有写操作锁就是互斥的。
2. 代码
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 读写锁
* @author xiaobin
* @date 2018/3/25
*/
public class TestReadWriteLock {
public static void main(String[] args) {
final 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" + i).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();
}
}
}