什么是线程安全性,怎么才能做到线程安全?
看看大神的总结
保证线程安全有哪些手段_大将黄猿的博客-CSDN博客_哪些可以保证线程安全
线程不安全的原因:
Java线程不安全的原因_大将黄猿的博客-CSDN博客_java线程不安全的原因
线程不安全引发的问题:
死锁: 程序死锁了,我该怎么办?_大将黄猿的博客-CSDN博客_程序出现死锁怎么办
是指多个的进程在执行过程中, 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象, 若无外力作用,他们都无法推进下去. 此时称系统处于死锁状态或系统产生了死锁
*一旦程序发生了死锁, 是无法软恢复的,只能重启程序,所以死锁是个很严重的问题*
死锁有哪些?
简单顺序死锁: 可以通过肉眼排查出来的死锁,一般都是争抢锁的顺序不对产生的, 如下图
动态死锁: 这种锁比较麻烦, 只有在运行时才能发现, 很难通过肉眼排查,如下图
假设有一个转账场景
我们以账户作为信息作为锁,而锁又是由参数传进来的。这样发生死锁条件由就有传入的参数决定了。再来看看我们调用层:
很显然,由于账户在形参中传的是反的,索引都是把持这自己的锁,获取别人的锁状态。看一下运行结果:
死锁产生的条件
- 必要条件: 多个操作者M争夺多个条件N, 并且M>=N
- 争夺资源的顺序不对
活锁:
什么是活锁?(就是死不了的锁,死了就放手)
发生在尝试拿锁机制中。由于尝试拿锁机制,在得到一个锁之后会尝试获取下一把锁。若下一把锁获取失败,直接会释放第一把锁。因此,如果程序要执行必须由该线程连续抢到两把锁。而随着锁内加锁的次数增加,这样概率只会越来越小。
解决方案,让线程之间略微休眠,错开拿锁时间。但效率影响相当明显。