上一篇:多线程04--线程的有序性_fengxianaa的博客-CSDN博客
程序的原子性指整个程序中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节,有着“同生共死”的感觉。对线程而言,一个操作一旦开始,就不会被其他线程所干扰。
java中必须借助于synchronized、Lock、锁等,来保证整块代码的原子性
class Demo2 implements Runnable {
volatile int a = 0;
@Override
public void run() {
for(int i =0;i<10000;i++){
a++;
}
}
}
public class T04_Volatile {
public static void main(String[] args) throws InterruptedException {
Demo2 d = new Demo2();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();t2.start();
t1.join();t2.join();
System.out.println(d.a);
}
}
3. CAS
class Demo implements Runnable {
AtomicInteger a = new AtomicInteger(0);
@Override
public void run() {
for(int i =0;i<10000;i++){
a.incrementAndGet();
}
}
}
public class T01_Cas {
public static void main(String[] args) throws InterruptedException {
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();t2.start();
t1.join();t2.join();
System.out.println(d.a);
}
}
流程图
LongAdder
class Demo2 implements Runnable {
LongAdder a = new LongAdder();
@Override
public void run() {
for(int i =0;i<10000;i++){
a.increment();
}
}
}
public class T02_LongAdder{
public static void main(String[] args) throws InterruptedException {
Demo2 d = new Demo2();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();t2.start();
t1.join();t2.join();
System.out.println(d.a);
}
}
流程图
ABA问题:
int a =1;
1. 线程1 获取a的最新值后,准备CAS操作,但这时线程暂停
2. 线程2 修改a的值为2
3. 线程3 又修改a的值为1
4. 线程1 继续运行,修改a的值。
这种情况下,线程1 虽然可以修改成功,但是这个a已经不是最初的a了,中间经历了一些变化,可能含义不同了,如果修改成功,可能导致一些问题,这就是ABA问题。
解决:加时间戳或版本号



