广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,更多java知识,android知识,ios知识,疯狂软件官网持续更新中。
CAS操作
CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。
我们常常做这样的操作
if(a==b) {
a++;
}
试想一下如果在做a++之前a的值被改变了怎么办?a++还执行吗?出现该问题的原因是在多线程环境下,a的值处于一种不定的状态。采用锁可以解决此类问题,但CAS也可以解决,而且可以不加锁。
int expect = a;
if(a.compareAndSet(expect,a+1)) {
doSomeThing1();
} else {
doSomeThing2();
}
这样如果a的值被改变了a++就不会被执行。
按照上面的写法,a!=expect之后,a++就不会被执行,如果我们还是想执行a++操作怎么办,没关系,可以采用while循环
while(true) {
int expect = a;
if (a.compareAndSet(expect, a + 1)) {
doSomeThing1();
return;
} else {
doSomeThing2();
}
}
采用上面的写法,在没有锁的情况下实现了a++操作,这实际上是一种非阻塞算法。
应用
java.util.concurrent.atomic包中几乎大部分类都采用了CAS操作,以AtomicInteger为例,看看它几个主要方法的实现:
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}
getAndSet方法JDK文档中的解释是:以原子方式设置为给定值,并返回旧值。原子方式体现在何处,就体现在compareAndSet上,看看compareAndSet是如何实现的:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
不出所料,它就是采用的Unsafe类的CAS操作完成的。
疯狂Java培训机构拥有最好的Java培训途径,这是疯狂Java老师们经过多年经验总结出来的。Java技术简单易学,虽然Java技术涉及的内容十分广泛,只要有资深教师传授技术知识,就能在短期内实现Java高级工程师的梦想。如果初学者能够参加疯狂Java培训,有好的老师,好的培训途径,好的教材,让你成为最好的编程高手。疯狂Java培训,零基础教学,名师教学让你学得快学得牢,还能灵活运用。学软件开发,首选疯狂Java培训机构。