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