J.U.C CAS
在JDK1.5之前,也就是J.U.C加入JDK之前,Java是依靠synchronized关键字(JVM底层提供)来维护协调对共享字段的访问,保证对这些变量的独占访问权,并且以后其他线程忽的该锁时,将可以看到对这些变量进行的更改(可见性,互斥性)。
锁机制的问题:
- 锁问题不可回避的,就是上下文切换,加重系统线程调度,引起性能问题;
- 不一致的获得多个锁的顺序,还可能引发死锁;
- 如果一个线程试图获得其他线程已经具有的锁时,那么该线程将被阻塞,直到该锁可用,期间它无法进行其他任何操作,试想对一组操作序列加锁,也许在这些操作序列中就仅仅一步操作需要同步,而其余大部分操作都可以同时进行,不会发生竞争问题。一个粗粒度的上锁策略,将严重的导致系统的吞吐量。
- 如果阻塞的线程是优先级高的任务,那么可能造成非常不好的结果(线程的优先级倒置);
前篇中所涉及的关键字volatile,在此处也并不能胜任,因为它仅仅提供可见性原语,它并不提供互斥访问,原子操作原语(对volatile修饰的int递增操作)。独占锁是一种悲观锁,synchronized就是一种独占锁。
比较并交换(CAS)
支持并发的第一个处理器提供原子的测试并设置操作。现在的处理器(Inter和Sparc)使用的最通用的方法是实现名为比较并转换或者CAS的原语。
CAS操作包含三个操作数-内存位置(V),预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。CAS有效的说明了"我认为位置V应该包含值A;如果包含该值,则将B放在这个位置;否则,就不要更改该位置的值,只告诉我这个位置现在的值既可"。
lock-free , wait-free
如果每个线程在其线程任意延迟(或者甚至失败)时都将持续进行操作,就可以说该算法是wait-free的。与此形成对比的是,lock-free算法要求仅某个线程总是执行操作。(wait-free的另一种定义是保证每个线程在器有限的步骤中正确计算自己的操作,而不管其他线程的操作,计时,交叉,速度)
无阻塞算法被广泛的用在操作系统和JVM级别,进行诸如线程和进程的调度任务。虽然他们的实现比较复杂,但相对与锁定的备选算法,他们有许多优点:可以避免优先级倒置和死锁的发生,竞争比较便宜,协调发生在更细粒度级别,提高吞吐量,其定义:
一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法
上面说了一大堆CAS的好,最后也该客观的评价一下CAS,当然它也有其缺点:
- "ABA"问题。J.U.C中AtomicMarkableReference, AtomicStampedReference解决"ABA"可以排上用场。
- 不停的循环重试知道成功,消耗大量CPU资源。Exponential Backoff。
- 在高度竞争的环境下,CAS性能反而比直接加锁低,所以CAS有他的适用场景。
J.U.C CAS的更多相关文章
- Problem J: Island Buses
主要题意是:大海之间有岛,有的岛之间有桥,问你岛的个数,桥的个数,以及没有桥联通岛的个数,其中最后一次输入的没有回车,不注意的话最后一次会被吞,第二,桥的两端的标记是“X”(X也代表陆地),“X”的四 ...
- UVa11427 Expect the Expected
数学期望 概率递推 每一天的概率都是独立且相同的.可以先推出每天打i盘赢j盘的概率f[i][j] f[i][j]=f[i-1][j]*(1-p) + f[i-1][j-1]*p 输 赢 设此人打一天胜 ...
- Tomcat崩溃
参考: http://bbs.csdn.net/topics/390391810?page=1 自己遇到的: --------------------------------------------- ...
- Uva1624 Knots
极其鬼畜的题. 初见根本没有思路. 二见根本没有思路. …… 多年(并不)之后突然想到,也许可以用链表模拟. 先用链表把每一个节点串起来,并对有覆盖的地方进行标记. 模拟解锁操作,如果一个节点和它所覆 ...
- Uva11464 Even Parity
枚举每个格子的状态显然是不可能的. 思考发现,矩阵第一行的状态确定以后,下面的状态都可以递推出来. 于是状压枚举第一行的状态,递推全图的状态并判定是否可行. /*by SilverN*/ #inclu ...
- POJ1285 Combinations, Once Again(背包 排列组合)
背包解组合数学问题,n种物品,每种num[i]个,求取r个的方法数. 背包思想,f[j]表示当前取j个数的方法数,则状态转移方程为 f[j] += f[k](max(j - num[i], 0) &l ...
- ZOJ 3703 Happy Programming Contest(DP)
题目链接 输出路径,搞了一个DFS出来,主要是这里,浪费了好长时间. #include <cstdio> #include <string> #include <cstr ...
- HDU 4722 Good Numbers(DP)
题目链接 脑子有点乱,有的地方写错了,尚大婶鄙视了... 来个模版的. #include <iostream> #include <cstdio> #include <c ...
- hdoj 4323
题意:给你n个数,m个查询,查询中包括一个数和一个最大编辑距离d,问n个数中和这个数的编辑距离不超过d的有多少个 编辑距离:http://baike.baidu.com/view/2020247.ht ...
随机推荐
- 淘宝NPM源的使用
npm作为国外的node仓库安装工具,自然会受到我大长城防火墙的干扰,国内用户在安装相关的资源的时候,会出现安装失败,以及速度很慢的情况.为了解决npm安装的问题,国内出现了很多npm的镜像网址,ta ...
- SQL SERVER 审核
USE master CREATE SERVER AUDIT audit1 TO FILE (FILEPATH='E:\SQLAudit') USE TEST CREATE DATABASE AUD ...
- 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)
一些小的C/S项目(winform.WPF等),因需要访问操作数据库,但又不能把DB连接配置在客户端上,原因有很多,可能是DB连接无法直接访问,或客户端不想安装各种DB访问组件,或DB连接不想暴露在客 ...
- 【最短路·差分约束】洛谷P1250
题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...
- [转载]github在线更改mysql表结构工具gh-ost
GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具! gh-ost是GitHub最近几个月开发出来的,目的是解决一个经常碰到的问题:不断变化的产品需求 ...
- 登陆模块的进化史,带大家回顾java学习历程(一)
一直在想着写点特别点的东西,让有兴趣学编程的人确实能学到点干货,今天就来随意写写. 大家在网上查找资料看到最多的demo估计就是登陆功能的演示了,为何大家偏爱拿登陆来做demo呢?因为行业应用类程序的 ...
- OC 异步顺序加载的方法
方法一:发射信号量 OC -异步顺序加载 先调用A接口,再调用B接口,再调用C接口 dispatch_semaphore_t semaphore = dispatch_semaphore_create ...
- CSS3 动画 cheatsheet
Transition 实例 .box { height: 100px; width: 100px; background: #212121; transition: width 1s ease, he ...
- Linux audio驱动模型
linux驱动 alsa模型: Linux ALSA声卡驱动之一:ALSA架构简介 Linux ALSA声卡驱动之二:声卡的创建 Linux ALSA声卡驱动之三:PCM设备的创建 Linux ALS ...
- 统计学习方法学习(四)--KNN及kd树的java实现
K近邻法 1基本概念 K近邻法,是一种基本分类和回归规则.根据已有的训练数据集(含有标签),对于新的实例,根据其最近的k个近邻的类别,通过多数表决的方式进行预测. 2模型相关 2.1 距离的度量方式 ...