CAS的原理

CAS(compareAndSwap),比较交换,是一种无锁的原子算法。

Cas(value,expect,newValue),如果vaule和ecpect一样,就更新为newValue,否则什么也不做,返回false

实现原理

通过调用unsafe.compareAndSwapInt(this, valueOffset, expect, update),之后该方法中调用虚拟机中的本地方法和底层操作系统进行操作

Cas带来的问题

  • 循环时间太长

    如果长时间得不到锁,会进行不断的循环,给cpu带来非常大的开销

    解决方法:在JUC中限制了cas自旋的次数,例如BlockingQueue的SynchronousQueue
  • 只能保证一个共享变量的原子性
    对于多个共享变量,这能使用锁
  • ABA问题
    当原来的值为A,变成B,然后又变为A,那么Cas检查时会发现没有变化,实质上已经发生过变化,这就是ABA问题。
    解决方法:每次变化的时候加版本号,使用AtomicStampedReference

AQS

是实现自定义锁的一个辅助类,提供了获取锁和释放锁的功能模板。

排它锁 共享锁
acquire(int flag)
以独占的模式获取对象,忽略中断
acquireShared(int arg)
以共享模式获取对象,忽略中断
tryAcquire(arg)
试图以独占模式获取对象
tryAcquireShared(int arg)
试图以共享模式获取对象
release(int arg)
以独占模式释放对象
releaseShared(int arg)
以共享模式释放对象

jdk提供的锁

  • ReentrantLock(支持锁的重入、公平锁和非公平锁)
  • ReentrantReadWriteLock

    锁降级:线程获取到写锁后,进行了数据修改,不能直接释放写锁,应该先获取读锁在释放写锁,最后释放读锁。

06 CAS的原理和AQS的更多相关文章

  1. iOS开发UI篇—程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  2. iOS开发UI篇—程序启动原理和UIApplication1

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  3. 程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  4. Jquery+ajax+json+servlet原理和Demo

    Jquery+ajax+json+servlet原理和Demo 大致过程: 用户时间点击,触发js,设置$.ajax,开始请求.服务器响应,获取ajax传递的值,然后处理.以JSON格式返回给ajax ...

  5. Mybatis插件原理和PageHelper结合实战分页插件(七)

    今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...

  6. 流水线技术原理和Verilog HDL实现(转)

    源:流水线技术原理和Verilog HDL实现 所谓流水线处理,如同生产装配线一样,将操作执行工作量分成若干个时间上均衡的操作段,从流水线的起点连续地输入,流水线的各操作段以重叠方式执行.这使得操作执 ...

  7. 计算机网络原理和OSI模型与TCP模型

    计算机网络原理和OSI模型与TCP模型 一.计算机网络的概述 1.计算机网络的定义 计算机网络是一组自治计算机的互连的集合 2.计算机网络的基本功能 a.资源共享 b.分布式处理与负载均衡 c.综合信 ...

  8. iOS-程序启动原理和UIApplication

    iOS开发UI篇—程序启动原理和UIApplication   一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...

  9. HBase学习笔记之HBase原理和Shell使用

    HBase学习指南之HBase原理和Shell使用 参考资料: 1.https://www.cnblogs.com/nexiyi/p/hbase_shell.html,hbase shell

随机推荐

  1. C++宽字符串转字符串

    这文章是更改别人代码 #include <string> #include <iostream> #include <stdlib.h> #include < ...

  2. C# 开发 Windows 服务 使用Log4net 组件 不能生成日志文件

    使用VS2012开发Windows服务,需要使用Log4net日志组件记录业务情况,但是始终生成不了日志文件. /// <summary> /// 入口方法 /// </summar ...

  3. vue2.0 之 nextTick

    Vue.nextTick 将回调延迟到下次 DOM 更新循环之后执行.在修改数据之后立即使用它,然后等待 DOM 更新. 它跟实例方法vm.$nextTick() 一样,不同的是 this 自动绑定到 ...

  4. Sumdiv(约数和问题)

    题目地址 看到这题的题解,大佬都说是小学奥数,蔡得我不敢鸡声. 求 \(a^b\) 所有的约数之和 mod \(9901\) \((1<=a,b<=5*10^7)\) 题解 做这道题,我还 ...

  5. windows下如何安装pip

    在安装pip前,请确认win系统中已经安装好了python,和easy_install工具 Python完成后 配置环境变量 在环境变量中添加Python目录 (1) 右键点击"计算机&qu ...

  6. 1N4148

    摘自http://baike.baidu.com/link?url=0iTO7zZvHpCeJiZurTPpjDT95YdJu7cKdTeCWfol36b4JG5ii15leQ7K4wJWAZIBNb ...

  7. [洛谷 P1013] NOIP1998 提高组 进制位

    问题描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  8. Graph Neural Networks for Computer Vision

    Graph Neural Networks for Computer Vision I was attracted by this image: This is an inspiring image ...

  9. qt qsplashscreen 启动画面 延时

    intdelayTime=3; QElapsedTimer timer; timer.start(); while(timer.elapsed()<(delayTime*1000)) { app ...

  10. MySQL JOIN 多表连接

    除了常用的两个表连接之外,SQL(MySQL) JOIN 语法还支持多表连接.多表连接基本语法如下: 1 ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON ...