线程安全的意思就是说在多线程的随机调用下,代码没有出现bug 或者说代码没有bug 都能够符合预期的方式来执行的就叫做线程安全
如果在多线程的随机调用下 出现了bug 那就是线程不安全
那怎么样才算是bug 是看对这个产品的需求 如果满足需求则没有bug(线程安全) 反之则是线程不安全
class Counter {
public int count = 0;
public void increase() {
count++;
}
}
public class Demo {
private static Counter counter = new Counter();
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 50000; i++) {
counter.increase();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 50000; i++) {
counter.increase();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//按道理说 创建两个Thread对象 每个对象实行5W次 一共就是10W次
//但是 最终打印的答案却不相匹配 这就是bug
/**
* 其实执行的 count++ 这个操作的底层 是三条指令 都是在 CPU 上完成的
* (1) 把内存的数据读取到 CPU 寄存器中 这个操作叫做 load
* (2) 把 CPU 的寄存器中的值进行计算(+1) 这个操作叫做 add
* (3) 把寄存器中的值再写回到内存中 这个操作叫做 save
*
* 由于是两个线程进行的去修改变量 而每次修改都是三个操作步骤 因为线程调度的顺序是不稳定的
* 因此 两个线程在真正执行这些操作的时候 就可能会有对总执行的排序顺序 也就会造成答案的不稳定 不唯一
*
*/
System.out.println("counter: " + counter.count);
}
}