一、什么是线程不安全和线程安全
- 定义:线程不安全:多线程并发执行某个代码时,产生了逻辑上的错误,结果和预期值不相同
- 线程安全是指多线程执行时没有产生逻辑错误,结果和预期值相同
二、线程不安全产生的原因
- 线程是抢占执行的。
- 有的操作不是原子的。当 cpu 执行一个线程过程时,调度器可能调走CPU,去执行另一个线程,此线程的操作可能还没有结束;(通过锁来解决)
- 多个线程尝试修改同一个变量(一对一修改、多对一读取、多对不同变量修改,是安全的)
- 内存可变性
- 指令重排序:java的编译器在编译代码时,会针对指令进行优化,调整指令的先后顺序,保证原有逻辑不变的情况下,来提高程序的运行效率。
三、怎样解决线程不安全
- 加锁
锁的特点:互斥的,同一时刻只有一个线程可以 获取到锁,其他线程如果尝试获取锁,就会发生阻塞等待,等到刚那个线程 释放锁 ,此时剩下的线程再重新竞争锁
基本操作:加锁,解锁(释放锁)
- 使用锁 —— 关键字 synchronized
- 加到普通方法前:表示锁 this;
- 加到静态方法前:表示锁当前类的类对象(类对象就是 JVM运行时,将 .class 文件加载到内存中获取到的(类加载));对象名 . getClass() --》 获取类对象
- 加到某个代码之前,显示指定给某个对象加锁;
如果两个对象有两把锁,各自锁各自的,就不会涉及冲突 / 互斥
但是,一旦锁里边的内容出现问题,就可能出现死锁,其他程序就只能一直等待,此时就得重启
四、相关代码
import java.