2023-09-30 11:21

CAS的运用

码自答

JavaEE

(173)

(0)

收藏

CAS Compare And Swap  比较并交换

CAS操作数据,如果内存位置的值与预期原值相匹配,就会将该内存位置的值更新为新值,否则不做任何处理。

CAS操作数据需要内置位置,预期的值和新的值。


CAS实现:

package com.wanmait.demo;

public class Test {

    public static int count = 0;//线程改变的数据
   
    public static AtomicInteger atomicInteger = new AtomicInteger(0);//通过CAS改变数据

    public static void main(String[] args) throws InterruptedException {
       
        CountDownLatch latch = new CountDownLatch(10);//线程同步工具,初始线程10个 ,10个线程执行结束之后执行主线程
 
        //匿名内部类
        Runnable runnable =  new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {

                    count++;
                    atomicInteger.getAndIncrement();//CAS数据加1
                }
                latch.countDown(); // 当前线程调用此方法,线程同步工具 线程计数器-1
            }
        };
        //同时启动多个线程
        for (int i = 0; i < 10; i++) {
            new Thread(runnable).start();	
	//创建并启动10个线程
        }

        latch.await(); // 主线程阻塞,直到10个线程执行结束  再执行主线程

        System.out.println("static count: " + count);//输出结果少于10000  每次运行可能不同

        System.out.println("AtomicInteger: " + atomicInteger.intValue());//10000 
    }
}



AtomicInteger整型原子类,通过原子方式更新Java整型变量的值


CAS缺点:高并发下多个线程操作同一个变量,会造成CAS失败,然后处于自旋状态,导致严重浪费CPU资源

0条评论

点击登录参与评论