1.基本概念  

  原子性是不可中断的最小操作;在Java中,一般通过加锁或者自旋CAS方式来确保原子操作;

  而CAS(compareAnd swap)作为Java中常用的保证原子性的手段,JDK1.5之后就提供了相关的操作类,java.util.concurrent.atomic包中的工具类;

  CAS概念:CAS操作需要两个值,旧值(预期的操作之前的值)和新值,先将旧值进行比较,如果旧值没有发生变化,则进行操作,如果旧值变化则不进行任何操作

2.常用来解释CAS的一个案例:

public class CASTest {
private int i = 0;
private AtomicInteger ai = new AtomicInteger();
private static final Integer NUM = 10;
private static CountDownLatch latch = new CountDownLatch(NUM); public static void main(String[] args) throws InterruptedException {
final CASTest t = new CASTest();
for(int i =0 ; i < NUM ; i++){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for(int j = 0 ; j < 100 ; j++){
t.count();
// t.safeCount();
}
latch.countDown();
}
});
thread.start();
}
latch.await();
System.out.println("======= over ======="+t.i);
} public void count(){
i ++ ;
} public void safeCount(){
for(;;){
int i = ai.get();
boolean b = ai.compareAndSet(i, i++);
if( b ){
break ;
}
} }
}

理想的结果是1000,但是非CAS的结果总是会有差异,而safeCount 采用的是CAS的方式进行原子操作;

3.CAS 操作存在的问题和解决方案

1.ABA问题

  问题描述:首先,假设一个变量经过A=>B=>A的变化过程,一个线程进行,获取到操作前的值为A,按照上面的概念这个线程获取到的旧值A,和这个变量进行变化后的现在的新值A是一样的。如果进行CAS自旋操作无疑是有问题的。

  解决方案:JDK中atomic包中提供了,AtomicStampedReference 类,提供了更完善的方法。通过增加标志,来对旧值进行判断。

2.循环时间长开销大

  问题描述:当一个线程修改的值,被其他线程再次修改后,自旋旧值比对长时间无法获取成功,导致资源的浪费;

解决方案:JVM中提供了puse指令可以解决这种问题;

3.只能保证一个变量的原子操作

  问题描述:如题

解决方案:通过将多个变量封装成一个对象,通过atomic包中的AtomicReference类来进行解决;

参考图书《java并发编程艺术》(ps:这个随笔就是看书笔记)

最后,

多线程01-CAS (CompareAndSwap)的更多相关文章

  1. Java多线程| 01 | 线程概述

    Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...

  2. Java 多线程 - 原子操作AtomicInteger & CAS(Compare-and-Swap)

    原子类简介:https://www.cnblogs.com/stephen0923/p/4505902.html AtomicInteger 介绍: https://yuwenlin.iteye.co ...

  3. Java多线程:CAS与java.util.concurrent.atomic

    锁的几种概念 悲观锁 总是假设最坏的情况,每次获取数据都认为别人会修改,所以拿数据时会上锁,一直到释放锁不允许其他线程修改数据.Java中如synchronized和reentrantLock就是这种 ...

  4. 多线程 | 03 | CAS机制

    Compare and swap(CAS) 当前的处理器基本都支持CAS,只不过每个厂家所实现的算法并不一样罢了,每一个CAS操作过程都包含三个参数:一个内存地址V,一个期望的值A和一个新值B,操作的 ...

  5. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  6. 多线程的CAS

    CAS Compare And Swap (Compare And Exchange) / 自旋 / 自旋锁 / 无锁 独占锁:独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所 ...

  7. Java 多线程 01

    多线程· Runnable 和 Thread 多线程的引入 * A:什么是线程 * 线程是程序执行的一条路径,一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率,可以同时完成多项工作 * ...

  8. 多线程01.newThread的方式创建线程

    1.java应用程序的main函数是一个线程,是被jvm启动的时候调用,线程的名字叫main 2.实现一个线程,必须创建一个thread实例,override run方法,并且调用start方法. 3 ...

  9. [Java复习] 多线程 Multithreading

    Q1多线程基础 进程和线程? 进程: 1. 一段程序执行过程,动态的,相对而言程序是静态的.(与类和对象的关系类似) 2. CPU资源分配最小单元,包括CPU调度和资源管理. 3. 一个进程可以有多个 ...

  10. Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

    不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的 尽管最初synchronized的性能效率比较差,但是随着版本的升级,synchro ...

随机推荐

  1. Java实现考察团组成

    考察团组成 某饭店招待国外考察团.按照标准,对领导是400元/人,随团职员200元/人,对司机50元/人. 考察团共36人,招待费结算为3600元,请问领导.职员.司机各几人. 答案是三个整数,用逗号 ...

  2. java实现第四届蓝桥杯空白格式化

    空白格式化 本次大赛采用了全自动机器测评系统. 如果你的答案与标准答案相差了一个空格,很可能无法得分,所以要加倍谨慎! 但也不必过于惊慌.因为在有些情况下,测评系统会把你的答案进行"空白格式 ...

  3. python自学Day07(自学书籍python编程从入门到实践)

    第8章 函数 函数是带名字的代码块,用于完成具体的工作. 学习定义函数,向函数传递信息. 学习如何编写主要任务是显示信息的函数,还有用于处理数据并返回一个或一组值得函数. 学习如何将函数存储在被称为模 ...

  4. 洛谷 P1115 最大子序和

    **原题链接** ##题目描述   给出一段序列,选出其中连续且非空的一段使得这段和最大.     **解法**:       1.暴力枚举 时间:O(n^3)       2.简单优化 时间:O(n ...

  5. swagger--Failed to load API definition.

    打开 http://localhost:5000/swagger/v1/swagger.json 提示错误 An unhandled exception occurred while processi ...

  6. 5、react-路由

    1.单页面:(只有一个index.html)(为什么要使用react-router再react中) 所有的组件都是再同一个index.html中进行显示的,它再显示的时候是怎么显示的,通过你点击的连接 ...

  7. Redis PHP扩展安装步骤

    ### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...

  8. STM32的ADC采样时间

    STM32的ADC采样时间与其ADC的时钟频率密不可分. 例:STM32F103系列的ADC的时钟是在APB2(最大72MHZ)上.我们可以对其分频: RCC_PCLK2_Div2: ADC cloc ...

  9. Java——String类(常用类)

    一.String类——描述字符串 常用的方法简单介绍: 1.charAt() 获取对应位置的字符 2.length() 获取字符串的长度 3.concat() 在字符串的尾部追加内容-----相当于连 ...

  10. Backup Database pubs to Disk='D:\DataSQL\pubs.bak' --->动态备份所有数据库

    备份数据库 在项目实施时,备份恢复数据库还是有必要的,自动或傻瓜式的操作比较方便,未测试,失业了,现在静不下心来,有机会要求再做这类操作时实现它,此处先收藏备用 /* <Dynamic SQL ...