我们用表格来展示吧,细节如下:
锁的特点 内置锁 可重入锁 读写锁灵活性 低 高 高
公平性 不确定 非公平(默认)+公平 非公平(默认)+公平
定时性 无 可定时 可定时
中断性 无 可中断 可中断
互斥性 互斥 互斥 读读共享,其他都互斥
建议优先选择内置锁,只有在内置锁满足不了需求时,再采用显式锁(比如可定时、可中断、公平性)
如果是读多写少的场景(比如配置数据),推荐用读写锁
总结可重入锁 ReentrantLock:需显式获取锁和释放锁,切记要在finally块中释放锁
读写锁 ReadWriteLock:基于显式锁(显式锁有的它都有),多了读写分离,实现了读读共享(多个线程同时读),其他都不共享(读写,写写)
区别:内置锁不支持手动获取/释放锁、公平性选择、定时、中断,显式锁支持
建议使用锁时,优先考虑内置锁
因为现在内置锁的性能跟显式锁差别不大
而且显式锁因为需要手动释放锁(需在finally块中释放),所以会有忘记释放的风险
如果是读多写少的场合,则推荐用读写锁(成对的读锁和写锁需从同一个读写锁类获取)
参考内容:
《Java并发编程实战》
《实战Java高并发》
后记最后,祝愿所有人都心想事成,阖家欢乐