ReentrantReadWriteLock(读写锁)
读写锁ReentrrantWriteLock, 其核心就是实现读写分离的锁,在高并发访问下,尤其是读多写少的情况下,性能要远高于重入锁。
之前学synchronized、ReentrantLock时,我们知道,同一时间内,只能有一个线程进行访问被锁定的代码,那么读写锁则不同,其本质是分成两个锁,即读锁、写锁。在读锁下,多个线程可以并发地进行访问,但是在写锁的时候,只能一个一个的顺序访问。
口诀:读读共享,写写互斥。读写互斥。
下面看一个demo,看一下读写锁的实现,顺便看一下读读共享,写写互斥。读写互斥的实例:
先看一下读读共享,把下面的内容注释掉:
运行看一下结果:
会发现,这两个线程是同时进入的,这就是读读共享;
写写互斥:
看一下结果:
可以看出,在t3线程进入时,锁被t3线程获得了,此时,t4线程只能等待t3线程释放锁,然后才能继续执行。
读写互斥跟上面的类似:
结果:
锁优化的总结:
1、避免死锁
2、减小锁的持有时间
3、减小锁的粒度
4、锁的分离
5、尽量使用无锁的操作,如原子操作(Atomic系列类),volatile关键字