ReentrantLock比较少用,它的作用和synchronized差不多。JDK1.6之后,synchronized底层实现里面也是有计数器维护,通过cas加锁释放锁,同时到现在synchronized也有很多优化,相比之下效率差不多。
    实际上优先使用synchronized,在开源项目中的源码其实大部分用的还是synchronized,其次是读写锁,再就是ReentrantLock。
    什么是读写锁?
    读写锁是分开的,可以加写锁也可以加读锁
    读锁和写锁是互斥的,也就是说,你加了读锁之后,就不能加写锁;如果加了写锁,就不能加读锁,但是如果有人加了读锁之后,别人可以同时加读锁
    读写锁主要解决的问题:如果你有一份数据,有人读,有人写,如果你全部都是用synchronized的话,会导致如果多个人读,也是要串行化,一个接一个的读。我们希望的效果是多个人可以同时来读,如果使用读锁和写锁分开的方式,就可以让多个人来读数据,多个人可以同时加读锁

    • 如果有人在读数据,就不能有人写数据,读锁 -> 写锁-> 互斥
    • 如果有人在写数据,别人不能写数据,写锁 -> 写锁 -> 互斥;如果有人在写数据,别人也不能读数据,写锁 -> 读锁 > 互斥