线程安全
2021-10-19 15:25:50 17 举报
AI智能生成
线程安全
作者其他创作
大纲/内容
如何保证线程安全
1.栈封闭
所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态
2.无状态
没有任何成员变量的类
3.类不可变
加final关键字
不提供任何可供修改成员变量的地方,成员变量不作为方法返回值
4.volatile
保证类的可见性
5.加锁和CAS
6.安全的发布
7.ThreadLocal
8.Servlet
非线程安全
在需求上,很少有共享的需求
接收到了请求,返回应答的时候,都是一个线程来负责
死锁
原因
资源多于一个,小于线程数量
主要是因为加锁的顺序不一致
死锁的类型
简单的
动态的
这种情况是可能由于外部入参顺序动态改变导致内部加锁顺序不一致
检测方法
jps 找应用id,jstack id查看持有锁的情况
解决方法
保证加锁的顺序性
可以使用对象的hashCode作比较
Lock.TryLock也可以,因为拿锁失败后,可以调用unlock方法
活锁
尝试拿锁的时候,多个线程之间互相谦让,不断发生拿锁,释放锁的过程
解决方法
每个线程休眠随机数,错开拿锁的时间
类的线程安全定义
1.多线程下使用这个类,不管多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全
类的线程安全表现
1.操作的原子性
2.内存的可见性
0 条评论
下一页