线程安全问题 --- 死锁

文章目录

  • 线程安全
    • 产生线程安全问题的原因
    • 上锁
    • 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);
    }
}

线程安全问题 --- 死锁_第1张图片两个线程各自给a自增五万次, 最后的结果有可能小于, 等于五万, 也有可能大于五万, 等于十万等诸多结果

产生线程安全问题的原因

  1. 多线程

你可能感兴趣的:(操作系统,安全,java,网络,开发语言,操作系统,系统安全,死锁)