读写锁
读写锁是一种特殊的锁,该锁把读操作和写操作分开了。
普通的锁提供了两个操作:加锁和解锁;
读写锁提供了三个操作:读加锁、写加锁和 解锁;
在有的场景中,只有少部分线程进行写操作,而大多数线程进行读操作。
- 读操作和写操作之间不需要保证原子性;
- 读操作和读操作之间不需要保证原子性、内存可见性和禁止指令重排序;
- 写操作和写操作需要保证原子性、内存可见性和禁止指令重排序。
因此将这三个锁搭配使用,就可以提高效率比。
- 几个线程之间只读数据,那么不用加锁;
- 如果几个线程之间有一个线程写数据,其他线程读数据,就需要写加锁和读加锁(保证内存可见性和禁止指令重排序即可,类似于单例模式中懒汉模式给实例对象加 volatile 关键字);
- 如果几个线程之间都进行写数据,那么需要写加锁。
因此可以发现,读写锁适用于少写多读的场景。
synchronized 不是读写锁