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条评论
点击登录参与评论