下列关于java语言的描述中错误的昰()
D. 支持单继承和多继承
CAS是英文单词CompareAndSwap的缩写中文意思是:比较并替换。CAS需要有3个操作数:内存地址V旧的预期值A,即将要更新的目标值B
CAS指令执行时,当且仅当内存地址V的值与预期值A相等时將内存地址V的值修改为B,否则就什么都不做整个比较并替换的操作是一个原子操作。
注:t1t2关于线程的问题是同时更新同一变量56的值
因為t1和t2关于线程的问题都同时去访问同一变量56,所以他们会把住内存的值完全拷贝一份到自己的工作内存空间所以t1和t2关于线程的问题值都為56
假设t1和t2在关于线程的问题竞争中关于线程的问题t1能去更新变量值改为57,而其他关于线程的问题都失败(失败的关于线程的问题并不会被挂起,而是被告知这次竞争中失败并可以再次发起尝试)。T1关于线程的问题去更新变量值改为57然后写到内存中。此时对于t2来说内存值改为57,与预期值56不一致就操作失败了(想改的值不再是原来的值)。
CAS算法的开销主要来自Cache Miss一旦导致CAS一直更新失败的话,它的性能昰有可能坏于加锁的方式的
上面我我们说了CAS算法,CAS实现的过程是先取出内存中某时刻的数据在下一时刻比较并替换,那么在这个时间差会导致数据的变化此时就会导致出现“ABA”问题。关于“ABA”问题我们假设如下事件序列:
关于线程的问题 1 从内存位置V中取出A。
关于线程的问题 2 从位置V中取出A关于线程的问题 2 进行了一些操作,将B写入位置V关于线程的问题 2 将A再次写入位置V。关于线程的问题 1 进行CAS操作发現位置V中仍然是A,操作成功尽管关于线程的问题 1 的CAS操作成功,但不代表这个过程没有问题——对于关于线程的问题 1 关于线程的问题 2 的修改已经丢失。
我们形象地画一个图来打个比方:
我们在AtomicReference的使用中就遇到了这样的ABA问题name怎么解决的呢?我们使用AtomicStampedReference就能很好的解决这个问題了首先,我们先看一下这一段代码(实现自动充值当少于20元时,充值20元再进行消费,每次消费10元):
我们在1处2处加上锁之后就OK了!这是结果:
这样问题就很好的解决了不过特别注意的是在1处和3处需要加锁,因为2处和4处的if条件是一个原子操作大家都知道,java是抢占式的关于线程的问题可能在这个原子操作执行结束后被另一个关于线程的问题所抢占,这样就是导致打印的时候的值不准确
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。