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有他的适用场景。
时间: 2025-01-11 08:37:14

J.U.C CAS的相关文章

Problem J: Island Buses

主要题意是:大海之间有岛,有的岛之间有桥,问你岛的个数,桥的个数,以及没有桥联通岛的个数,其中最后一次输入的没有回车,不注意的话最后一次会被吞,第二,桥的两端的标记是“X”(X也代表陆地),“X”的四周都可以有“B”形成的桥,一开始没写好,后来根据“X”标记所有的桥只能走一次然后标记……总之,虽然是水题,写出来还是蛮开心的…… #include <iostream> #include <cstdio> #include <cstdlib> #include <al

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

【POJ3498】March of the Penguins(最大流,裂点)

题意:在靠近南极的某处,一些企鹅站在许多漂浮的冰块上.由于企鹅是群居动物,所以它们想要聚集到一起,在同一个冰块上.企鹅们不想把自己的身体弄湿,所以它们在冰块之间跳跃,但是它们的跳跃距离,有一个上限. 随着气温的升高,冰块开始融化,并出现了裂痕.而企鹅跳跃的压力,使得冰块的破裂加速.幸运的是,企鹅对冰块十分有研究,它们能知道每块冰块最多能承受多少次跳跃.对冰块的损害只在跳起的时候产生,而落地时并不对其产生伤害. 现在让你来帮助企鹅选择一个冰面使得它们可以聚集到一起. 第一行整数N,和浮点数D,表示

POJ 2769 Reduced ID Numbers 同余定理

Reduced ID Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8989 Accepted: 3610 Description T. Chur teaches various groups of students at university U. Every U-student has a unique Student Identification Number (SIN). A SIN s is an

hdu 4185 Oil Skimming(二分匹配)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 374 Problem Description Thanks to a certain "green" resources company, there is a new profitable

hzau 1201 Friends(树形dp)

1201: Friends Time Limit: 1 Sec  Memory Limit: 1280 MBSubmit: 119  Solved: 25[Submit][Status][Web Board] Description In a country, the relationship between people can be indicated by a tree. If two people are acquainted with each other, there will be

POJ1285 Combinations, Once Again(背包 排列组合)

背包解组合数学问题,n种物品,每种num[i]个,求取r个的方法数. 背包思想,f[j]表示当前取j个数的方法数,则状态转移方程为 f[j] += f[k](max(j - num[i], 0) <= k < j) 外层循环枚举物品,内层循环从大到小枚举空间,最内层枚举方法数. #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<s

uva 503 - Parallelepiped walk(几何)

题目链接:uva 503 - Parallelepiped walk 恶心题,将三维转成两维,直线距离最短,WA了一天.假设起点在地面,除了考虑经过0,1个面的可能,还要考虑经过两个面到达的可能.后面提供一个生成数据的代码. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll inf = 0x3f3f3f

hunnu--11548--找啊找啊找朋友

找啊找啊找朋友 Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users: 14, Accepted users: 11 Problem 11548 : No special judgement Problem description   小明和小红是一对好朋友,小明一有空就去找小红玩.但是小红飘忽的行踪让小明很是伤脑筋. 小红居住的小区的地下有当年抗战时期留下的地道,小红平时总是