目录
一、原子性问题
1、带来原子性问题的原因
线程切换是带来原子的根本原因,java的并发程序是基于多线程的,自然就会涉及到任务切换。而任务切换的时机是可以发生cpu的时间片结束时,由于目前我们使用的编程语言都是高级语言,一条高级语言往往是需要多条CPU指令完成的,例如count++,至少需要三条CPU指令。
- 指令1:首先需要把变量count从主内存中加载cpu的寄存器中
- 指令2:在寄存器中执行+1操作
- 指令3:将结果写入内存(缓存机制可能导致写入的是cpu的缓存而不是内存)
如下图所示,两个线程如果在执行count++的时候,过程如果发生了线程切换,会导致得不到预期的结果2,可能会出现意向不到结果,两个线程对count执行++操作后,在主内存中值为1.

原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他
private static int count;
public static void increment(){
try {
Thread.sleep(10);
} catch (InterruptedException e) {

文章讨论了在多线程环境下,由于线程切换导致的原子性问题,如在`count++`操作中可能出现的非预期结果。为了解决这个问题,文章提出了三种策略:使用`synchronized`关键字、CAS(CompareandSwap)以及`ReentrantLock`。每种方法都确保了同一时间只有一个线程能执行特定操作,从而保证了原子性。
最低0.47元/天 解锁文章
926

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



