CAS是Compaare and-Swap的缩写,这意味着比较和交换。作为一个例子,捕获AtomicInteger,它为视觉值提供了一种方法(主存储器中修改后值的期望值)是修改值。返回值的方法是布尔类型。修改是成功的,并恢复了真实。
方法的示例:
在上面的示例中,类成员变量的初始值由构造函数指定为0:0:
然后执行方法,主线程从主内存副本到工作线程的副本,值为0,并且值修改为1.如果此时主内存中值的值0(这意味着它尚未通过其他线程修改),将修改的复制值刷回主内存更新值的值。因此,上面的示例运行了True的结果,1::
将上述示例修改为:
在上面的示例中,当主线程称为第二个调用方法时,该值的值已修改为1,该值不符合其扩展的值,因此修改将失败。上面的示例的输出是如下:
查看方法源代码:
该方法通过调用类方法实现相关功能。该方法包含四个参数:
因此,该方法的含义是获得主内存中当前对象变量的值,并将其与传输的预期值进行比较。
那是什么?是原子吗?查看此方法的源代码:
此方法不能实现特定的Java代码,该方法通过关键字进行了修改。从Java方法无法直接访问基础系统,该类等同于后门,该系统可以通过该方法直接操作特定内存的数据该类别存在于袋中,JVM将帮助我们进行相应的汇编指令。类中的CAS方法是CPU平行的,由几个指令组成,以完成完成功能的过程。执行原语必须是连续的,在执行过程中不允许中断,并且没有数据不一致。
了解CAS原理后,我们回顾的源代码:
此方法通过调用类方法来实现相关功能。键入查看该方法的源代码:
结合源代码,我们可以看到为什么该方法是安全的:
它是对象本身;对象的成员变量的内存地址;需要更改的金额;在主内存中获取成员变量的方法是对象的值。do while while loop中的逻辑是:使用当前对象的值和比较,如果相同,则意味着尚未修改该值通过其他线程,已更新为true(CAS);否则,继续获取值并进行比较,直到更新完成为止。
CAS并不完美,有这些缺点:
CAS实施的一个重要前提是目前需要删除和交换特定时刻的数据。例如,这之间的时间差将导致数据更改。例如:变量A的值来自线程1的主内存是a,并且变量a的值从主存储器到主机从线程2页面是A.DUE到A.DUE到the the the线程调度的不确定性,此时可能会短暂悬挂Thread1。thread2已执行了一些操作以将值修改为b,然后执行了一些操作以修改后面的值。当胶片重新执行时,它会发现主内存中可变a的值仍然是a,因此,CAS操作成功了。
那么如何解决CAS的ABA问题?从上述解释课程中,灯光无法确保判断的价值等于值的价值,因此我们需要附加指标来协助判断,类似到时间戳,版本号等。
JUC为我们提供了一堂课。可以通过查看其结构方法来看待它。除了指定初始值外,您还需要指定版本号(邮票):
我们使用此课程来解决ABA问题。首先,模拟ABA问题场景:
运行程序,输出如下:
使用ABA的解决方案:
程序输出如下: