锁的分类以及死锁

锁的分类:
  1. 乐观锁和悲观锁
    乐观锁:乐观锁乐观的认为,多线程同步数据时,其他线程不会对数据有任何操作。只有当做更新操作的时候才会检查数据是否被修改。如果没有被修改,就进行更新操作,如果被修改了,就报错,或者进行重写写入。
    悲观锁:悲观锁悲观的认为,在进行多线程数据同步时,其他线程一定会进行数据的修改,因此在进行操作时一定要进行synchronized和lock上锁。

  2. 自旋锁和非自旋锁
    自旋锁:当一个数据被上锁后,其他的线程就在就绪车间一直挤着。当锁被释放后在去争抢锁。
    非自旋锁:当一个数据被上锁后,其他的线程会被放入等待车间,当锁被释放的时候才会唤醒notify他们。

  3. 可重入锁
    可重入锁:递归中用的较多,当一个线程获取锁后可以在其内部继续获取锁,并用一个变量记录锁的数量。

  4. 偏向锁,轻量级锁,重量级锁
    偏向锁:偏向锁记录了一个经常对数据进行操作的线程,这个线程可以自动获取锁,降低了获取锁的资源消耗。并且在并发编程中一般都是一个线程多次获取同一个锁。
    轻量级锁:偏向锁获取锁后,另外一个线程要获取锁,就会升级为轻量级锁。
    重量级锁:当有轻量级锁后,还有线程要获取锁时,就自动升级为重量级锁。

  5. 互斥锁和共享锁
    互斥锁:当数据被一个线程获取互斥锁后,那么这个数据就不能在获取其他的锁。互斥锁可以进行读写操作。
    共享锁:当数据被一个线程获取共享锁后,这个数据仍然能获取锁,只不过只能获取共享锁。共享锁只能进行读的操作,适合大量数据的读操作。

  6. 公平锁和非公平锁
    公平锁:当一个线程获取锁后,其他线程依次进行排队,线程们按照顺序获取锁。
    非公平锁:当一个线程获取锁后,其他线程进行争抢,运气好就能获得锁,不必按顺序排序获取锁。有时线程不必进行阻塞状态就可以直接获取锁。

死锁
死锁产生的条件
  • 互斥条件:进程对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  • 不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程主动释放。
  • 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
  • 环路等待条件:存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
如何避免死锁
  • 加锁顺序(线程按一定顺序加锁,若所有线程都按相同顺序获得锁,就能避免死锁)

  • 加锁时限(线程获取锁时加上时限,超时则放弃并释放所占有的锁,就能避免死锁)

  • 死锁检测(一个更优的预防机制,主要针对不可能实现按序加锁和加锁时限的场景)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值