一. 线程安全问题
概念
首先, 线程安全的意思就是在多线程各种随机调度的情况下, 代码不出现 bug 的情况. 如果在多线程调度的情况下, 出现 bug, 那么就是线程不安全.
二. 观察线程不安全的情况
下面我们用多线程来累加一个数, 观察线程不安全的情况:
用两个线程, 每个线程对 counter 进行5000次自增.预期结果10000.
Class Counter {
public int count = 0;
public void increase() {
count++;
}
}
public class Demo {
public static Counter counter = new Counter();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread( () -> {
for (int i = 0; i < 5000; i++) {
counter.increase();
}
});
Thread t2 = new Thread( () -> {
for (int i = 0; i < 5000; i++) {
counter.increase();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("count : " + counter.count);
}
}
那我们再来看运行结果:




根据截图的结果我们可以看到, 每一次运行结果, count 的值都不一样, 反正不是10000.
那么为什么会出现这种问题呢?
首先我们要知道进行的 count++ 的操作, 底层 是三条指令在CPU上完成的.
- load -> 把内存的数据读取到 CPU 寄存器上

本文深入探讨了Java中线程安全的概念,通过实例展示了线程不安全的情况,如并发自增导致的结果不一致。分析了线程不安全的原因,包括抢占式执行、非原子操作、内存可见性和指令重排序。提出了加锁(synchronized)作为解决线程安全问题的一种方法,并通过代码示例解释了其工作原理。最后,强调了锁的粒度对并发性能的影响,以及单线程加锁无法确保线程安全的问题。
最低0.47元/天 解锁文章
261

被折叠的 条评论
为什么被折叠?



