ReadWriteLock也是一个接口,提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程。
基本规则: 读读不互斥 读写互斥 写写互斥
问题: 既然读读不互斥,为何还要加读锁
答: 如果只是读,是不需要加锁的,加锁本身就有性能上的损耗
如果读可以不是最新数据,也不需要加锁
如果读必须是最新数据,必须加读写锁
读写锁相较于互斥锁的优点仅仅是允许读读的并发,除此之外并无其他。
结论: 读写锁能够保证读取数据的 严格实时性,如果不需要这种 严格实时性,那么不需要加读写锁。
简单的实现:
package readandwrite;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MyTest {
private static ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
private static double data=0;
static class readClass implements Runnable{
@Override
public void run() {
rwl.readLock().lock();
System.out.println("读数据:"+data);
rwl.readLock().unlock();
}
}
static class writeClass implements Runnable{
private double i;
public writeClass(double i) {
this.i = i;
}
@Override
public void run() {
rwl.writeLock().lock();
data=i;
System.out.println("写数据: "+data);
rwl.writeLock().unlock();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService pool=Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
pool.submit(new readClass());
pool.submit(new writeClass((double)new Random().nextDouble()));
pool.submit(new writeClass((double)new Random().nextDouble()));
Thread.sleep(1000);
}
pool.shutdown();
}
}