【公平锁 和 非公平锁】


公平锁 和 非公平锁

公平锁:类似食堂打饭,按照申请锁的顺序来获取锁类似厕所蹲坑先来后到

公平锁就是很公平 在并发环境下每个线程在获取锁的同时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待就占有锁,否则就加入到等待队列中,以后会按照FIFO的规则从队列中取到自己

非公平锁: 多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下可能造成优先级反转和饥饿现象

非公平锁上来就尝试占有锁,如果占有失败,在采取类似公平锁的方式

并发包ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁 默认是非公平锁

优势

非公平锁的优点在于吞吐量必公平锁大 对于synchronized而言 也是一种非公平锁.

可重入锁(递归锁)

只在同一个线程外层函数获取锁后,内层递归函数仍然能够获取该所得代码在同一个线程在外层获取所得时候,进入内层会自动获取锁也就是说 线程可以进入任何一个他已经拥有的锁所同步者的代码块

ReentrantLock 和synchronized 典型的可重入锁 可避免死锁

自旋锁

尝试获取锁但是不会立刻阻塞,而是采用循环的方式来尝试获取锁 优点 减少上下文切换 缺点 循环会消耗CPU

类似于 我要向老师问题 但是老师有事在打电话 那我有两种方式 一种就是一个在那等 阻塞着,一种就是 下去抽根烟一会再回来 如果打完了就问打不完继续干自己的事 再回来看 一直循环

手写自旋锁

less大致思路: 通过CAS操作完成自旋锁 -- A线程先进来调用myLock方法自己持有5秒钟 -- B进来后发现当前线程持有锁不为空 --
          只能通过自旋等待 -- 直到A释放锁后B随即抢到

独占锁(写)/共享锁(读)/互斥锁/读写锁

独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁

共享锁:指该锁可被多个线程所持有

对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁

读锁的共享可保证并发读是非常高效的,读写,写读,写写的过程是互斥的

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值