本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。