cas 并发,java多线程cas,java并发编程之cas详解

cas 并发,java多线程cas,java并发编程之cas详解

本文主要介绍java并发编程中cas的详细讲解,涉及cas的使用场景以及cas作为原子操作的使用等。有一定的参考价值,有需要的朋友可以了解一下。

CAS(比较和交换)比较和替换是一种用于设计并发算法的技术。简单来说,比较替换就是将一个预期值与一个变量的当前值进行比较。如果当前变量的值等于我们的期望值,我们将用一个新值替换当前变量的值。这听起来可能有点复杂,但其实你理解了之后就很简单了。接下来,我们来详细了解一下这项技术。

CAS的使用场景

程序和算法中的一个常见模式是“检查并执行”模式。当代码首先检查变量的值,然后根据该值执行某些操作时,就会出现操作前检查模式。这里有一个简单的例子:

MyLock类{

私有布尔locked=false

公共布尔锁(){

如果(!锁定){

locked=true

返回true

}

返回false

}

}

上面的代码,如果用在多线程程序中,会造成很多错误,但是现在请忘记它。

如您所见,lock()方法首先检查locked成员变量是否等于false,如果是,则将locked设置为true。

如果同一个线程访问同一个MyLock实例,上面的Lock()将无法正常工作。如果一个线程检查locked的值,然后将其设置为false,同时,一个线程B也在检查locked的值,或者在线程A将locked的值设置为false之前。所以线程A和线程B可能都会看到locked的值是假的,然后两个都会根据这个信息做一些事情。

为了在多线程程序中运行良好,“checkthenact”操作必须是原子的。也就是说,“check”操作和“act”作为一个原子代码块执行。没有多个线程同时执行原子块。

下面是一个代码示例,它使用synchronized关键字将前面的lock()方法重新构造成一个原子块。

MyLock类{

私有布尔locked=false

公共同步布尔锁(){

如果(!锁定){

locked=true

返回true

}

返回false

}

}

现在lock()方法是同步的,所以一次只有一个线程可以在同一个MyLock实例上执行它。

原子锁方法实际上是“比较和交换”的一个例子。

CAS被用作原子操作

现在原子CAS操作已经在CPU内部执行了。从Java5开始,可以使用java.util.concurrent.atomic包中的一些原子类在CPU中使用这些函数。

以下是使用AtomicBoolean类实现lock()方法的示例:

公共静态类MyLock {

private atomic boolean locked=new atomic boolean(false);

公共布尔锁(){

return locked . compareandset(false,true);

}

}

锁定的变量不再是布尔类型,而是原子布尔类型。该类中有一个compareAndSet()方法,该方法将预期值与AtomicBoolean实例的值进行比较,如果两者相等,则用新值替换原始值。在本例中,它将locked的值与false进行比较,如果locked的值为false,则将其更改为true。

如果值被替换,compareAndSet()返回true,否则返回false。

使用Java5提供的CAS特性而不是使用它自己的实现的优点是,Java5中内置的CAS特性允许您利用运行程序的机器的CPU的底层CAS特性。这将使带有CAS的代码运行得更快。

总结

以上就是关于java并发编程cas的详细讲解,希望对你有所帮助。有兴趣的朋友可以继续参考这个站点:Java系统高并发解决方案详解,Java并发编程的重入锁和读写锁,Java并发编程的信号量计数详解等。如果你有任何问题,请随时留言。欢迎您提出宝贵意见,边肖将及时回复您。感谢您对本网站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: