线程都能带来哪些风险?想了解线程安全问题吗?请仔细阅读本篇文章,将详细带你学习什么是线程安全!!!
目录
一、什么是线程安全和线程不安全?
简单来说,某个代码,在多线程环境下执行,会出bug,就叫做线程不安全。
线程安全:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。
本质上是因为线程之间的调度顺序是不确定的,那么我来举例说明一下:
class Counter{ private int count = 0; public void add(){ count++; } public int get(){ return count; } } class ThreadDemo{ public static void main(String[] args) throws InterruptedException { Counter counter = new Counter(); Thread t1 = new Thread(() -> { for (int i = 0; i < 50000; i++) { counter.add(); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 50000; i++) { counter.add(); } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.get()); } }
上述代码是俩个线程针对同一个变量,各自自增5w次,那么结果会是什么?
是10w吗?还是其他?下面来看结果:
此时会疑惑???为什么不是正常预期中的结果呢?这是因为由多线程引起的bug,线程不安全问题!!!
那么为什么会出现上述情况呢,和线程的随机调度密切相关!!!
count++操作,本质上是三个cpu指令构成
1.load,把内存中的数据读取到cpu寄存器中
2.add,把寄存器中的值,进行+1运算
3.save