栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程04--线程的原子性、CAS

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程04--线程的原子性、CAS

上一篇:多线程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问题。

解决:加时间戳或版本号

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/839499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号