美文网首页理论一些收藏
坚持打卡学习第十九天——多线程二(锁了解)

坚持打卡学习第十九天——多线程二(锁了解)

作者: 去追星星 | 来源:发表于2022-01-04 17:34 被阅读0次
乐观锁与悲观锁
  • 乐观锁:操作数据不会上锁,更新数据会判断在此期间是否有其他线程修改数据
  • 悲观锁:操作数据就会上锁,其他拿不到锁的线程都会阻塞
    使用场景:
    乐观锁适用于读多写少的场景,可以使用版本号机制、CAS算法实现
    java中synchronized、ReentrantLock就是悲观锁,适用于读少写多的场景
独占锁和共享锁
  • 独占锁:同时只能被一个线程所持有,synchronized和Lock就是独占锁
  • 共享锁:可被多线程持有,一个线程加上共享锁,其他线程也只有对数据加共享锁,只能读不能写
互斥锁和读写锁
  • 互斥锁:独占锁的一种常规实现,具有唯一性和排他性
  • 读写锁:共享锁的一种具体实现,读写锁管理一组锁,一个是读读,一个是写锁;写锁优先级高于读锁,写锁是独占的,写锁是共享的,因此读写锁并发度高于互斥锁
公平锁和非公平锁
  • 公平锁:线程按照申请锁的循序来获取锁
  • 非公平锁:不是按顺序获取(可能存在某一线程一直得不到锁),synchronized关键字是非公平,ReentrantLock默认非公平
可重入锁(递归锁)

统一线程在外层方法获取了锁,进入内层会自动获取锁,synchronized和ReentrantLock是可重入锁,可重入锁可以一定程度避免死锁

自旋锁

线程没有获取锁的时候不被挂起,而是执行忙循环,目的是减少线程被挂起的几率,但另一线程长时间占用锁,线程自旋之后还是会挂起,因此,自旋锁不适用于所占用时间长的场景

分段锁

不是具体的锁,是一种锁的设计,目的细化锁的粒度,CurrentHashMap 底层就用了分段锁,使用Segment,因此可以并发使用

相关文章

网友评论

    本文标题:坚持打卡学习第十九天——多线程二(锁了解)

    本文链接:https://www.haomeiwen.com/subject/plaqcrtx.html