文章目录
- 线程安全
-
- 产生线程安全问题的原因
- 上锁
- synchronized使用方法
-
- 1. 修饰方法
- 2. 修饰代码块
- synchronized的可重入性
- 死锁
-
- 什么是死锁
- 死锁的三个典型情况:
- 死锁的四个必要条件
- 如何破除(避免)死锁
- 线程安全类
线程安全
由于多个线程之间是抢占式执行的
, 这就给调度执行顺序带来了随机性, 程序员需要在n多个调度执行顺序中保证每一个顺序最后执行的结果都是正确的, 如果其中有一个执行顺序出错, 则视为是出现bug, 即发生了线程安全问题
下面是一个有线程安全问题的代码:
package Thread;
class Add{
int a = 0;
public void add(){
for(int i = 0 ; i < 50000; i++){
a++;
}
}
}
public class ThreadDome11 {
public static void main(String[] args) {
Add a = new Add();
Thread t1 = new Thread(()->{
a.add();
});
Thread t2 = new Thread(()->{
a.add();
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("最终值为:" + a.a);
}
}
两个线程各自给a自增五万次, 最后的结果有可能小于, 等于五万, 也有可能大于五万, 等于十万等诸多结果
产生线程安全问题的原因
- 多线程之