并发安全问题

线程安全性

​ 会发生不可预知的结果即是线程不安全

线程封闭

​ 即只有一个线程能操作改变该变量

  • 栈封闭,局部变量
  • ThreadLocal,线程本地变量

无状态类

让类不可变

final 修饰

加锁和 CAS

死锁

互相抢占需要继续运行的锁

  1. 多操作争夺多资源
  2. 争夺资源顺序不对
  3. 争夺者对资源不放手

jps 查询应用 id,jstack id 查看应用持有锁情况

活锁

tryLock()

可重入锁可以通过 tryLock() 方法去尝试拿锁,未拿到锁就释放当前所持锁

如 A 持有 1 锁,tryLock(锁 2),
B 持有 2 锁,tryLock(锁 1),此时 AB 都会释放锁,再次尝试重新拿取,但有可能一直重现以上情况。

线程饥饿

未阻塞却一直拿不到 cpu 资源

单例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 懒汉
public class SingleInit {
private SingleInit() {
}

private static class InstannceHolder {
private static SingleInit instance = new SingleInit();
}

public static SingleInit getInstance() {
return InstanceHolder.instance;
}
}

// 饿汉
public class SingleInit {
private SingleInit() {
}

private static SingleInit singleInit = new SingleInit();
}