并发编程09_并发安全

什么是线程安全性,怎么才能做到线程安全?

看看大神的总结

保证线程安全有哪些手段_大将黄猿的博客-CSDN博客_哪些可以保证线程安全

线程不安全的原因:

Java线程不安全的原因_大将黄猿的博客-CSDN博客_java线程不安全的原因

线程不安全引发的问题:

死锁: 程序死锁了,我该怎么办?_大将黄猿的博客-CSDN博客_程序出现死锁怎么办 

是指多个的进程在执行过程中, 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象, 若无外力作用,他们都无法推进下去. 此时称系统处于死锁状态或系统产生了死锁

*一旦程序发生了死锁, 是无法软恢复的,只能重启程序,所以死锁是个很严重的问题*

死锁有哪些?

简单顺序死锁: 可以通过肉眼排查出来的死锁,一般都是争抢锁的顺序不对产生的, 如下图

 

动态死锁: 这种锁比较麻烦, 只有在运行时才能发现, 很难通过肉眼排查,如下图

image.png

 假设有一个转账场景

我们以账户作为信息作为锁,而锁又是由参数传进来的。这样发生死锁条件由就有传入的参数决定了。再来看看我们调用层:

image.png

 image.png

 很显然,由于账户在形参中传的是反的,索引都是把持这自己的锁,获取别人的锁状态。看一下运行结果:

image.png

死锁产生的条件

  1. 必要条件: 多个操作者M争夺多个条件N, 并且M>=N
  2. 争夺资源的顺序不对

活锁:

什么是活锁?(就是死不了的锁,死了就放手)
发生在尝试拿锁机制中。由于尝试拿锁机制,在得到一个锁之后会尝试获取下一把锁。若下一把锁获取失败,直接会释放第一把锁。因此,如果程序要执行必须由该线程连续抢到两把锁。而随着锁内加锁的次数增加,这样概率只会越来越小。

解决方案,让线程之间略微休眠,错开拿锁时间。但效率影响相当明显。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值