并发安全问题
线程安全性
会发生不可预知的结果即是线程不安全
线程封闭
即只有一个线程能操作改变该变量
- 栈封闭,局部变量
- ThreadLocal,线程本地变量
无状态类
让类不可变
final 修饰
加锁和 CAS
死锁
互相抢占需要继续运行的锁
- 多操作争夺多资源
- 争夺资源顺序不对
- 争夺者对资源不放手
jps 查询应用 id,jstack id 查看应用持有锁情况
活锁
tryLock()
可重入锁可以通过 tryLock() 方法去尝试拿锁,未拿到锁就释放当前所持锁
如 A 持有 1 锁,tryLock(锁 2),
B 持有 2 锁,tryLock(锁 1),此时 AB 都会释放锁,再次尝试重新拿取,但有可能一直重现以上情况。
线程饥饿
未阻塞却一直拿不到 cpu 资源
单例
1 | // 懒汉 |