荣新IT培训中心
全国咨询热线:400-1335-066
您现在的位置:首页>行业新闻 > 正文

Java培训 JAVA并发--CAS

时间:2017-09-28 11:33:53 来源:荣新IT教育培训 作者:荣新科技

近几年选择参加java培训的人越来越多,荣新教育小编带你学java,每天学一点,一年成为java编程高手。


Java培训


什么是CAS?

CAS意指compare and swap,即比较并交换。它代表在java中一类方法,原子的实现数据交换并且判断数据内容是否符合预期。

通常有三个参数,需要交换的对象A,我们预期对象A的值为B,即将交换的A的值C,在单线程中我们只需要如下代码即可:

1
2
3
4
5
6
Object a;//最初的对象
Object b;//预期a的值
Object c;//最终a的值
if(a==b){
    a = c;
}

 但在多线程中,上面的代码会出现严重的问题,如果线程1经判断a==b,准备执行a=c时,cpu切换到线程2,且将a改成了d,

    当cpu重新切换到线程1,此时a已经不等于b了,也即是执行a=c的前提条件已经不满足;

 因此我们需要对上面的操作原子的进行,当然我们可以对程序块加锁实现,这里我们讨论另一种实现方法,即使用Unsafe类CAS方法

Unsafe类?

这是sun.misc包中一个类,这并不是一个正常的类,没有办法使用正常的new Unsafe()来创建对象,其虽然提供了静态的getUnsafe方法,但仍然无法使用,调用时会报java.lang.SecurityException: Unsafe的错误。当然我们可以通过反射去绕过限制,但除非必要在正式项目中最好不要使用,拿来探究jvm确实是很有用的类。

1
2
3
4
5
6
7
8
9
10
11
12
private Unsafe() {
}
 
@CallerSensitive
public static Unsafe getUnsafe() {
    Class var0 = Reflection.getCallerClass();
    if(var0.getClassLoader() != null) {
        throw new SecurityException("Unsafe");
    else {