CAS算法存在着三个参数内存值V,舊的预期值A以及要更新的值B。当且仅当内存值V和预期值B相等的时候才会将内存值修改为B,否则什么也不做直接返回false;
比如说某一个线程要修改某个字段的值,当这个值初始化的时候会在内存中完成根据Java内存模型,该线程保存着这个变量的一个副本;当且仅当这个变量嘚副本和内存的值如果相同那么就可以完成对值得修改,并且这个CAS操作完全是原子性的操作也就是说此时这个操作不可能被中断。
上述代码中什么变量被volatile修饰此时说明该变量在多线程操作的情况下可以保证内存的可见性,但是不可以保证原子性操作因此在多线程并發的时候还是会出现问题的;利用Javap命令来看看汇编指令:
线程2传入两个参数,一个当前值以及一个预期值;当前值,也就是current=3.要修改成为4;此时当前值也就是预期值和内存中的value比较此时都是3,那么修改内存中的值为4;
3)线程1此时再次执行compareAndSwapInt()方法的时候发现内存中的值为4,預期的值是3两者不相等,此时就不可以再次赋值了;
假定在某个时刻某个线程从内存中取出A然后在下个时刻准备更新这个值;在这个時间差内数据发生了改变;
假设线程1从内存中取出了A,线程2也从内存中取出了A并且将值修改为B,最后又改为A当线程1去更新值得时候发現内存中的数据和线程备份数据相同,可以更新;但是此时内存中的值其实发生了变化的只不过又变回去了;在实际的开发过程中,ABA可能会带来一些问题但是我认为无关紧要,我们需要的只是数值的变化而已;
对于单向链表实现的栈而言;假设存在一个链表 A---->B;线程1要去将棧顶的数据修改为B但是此时线程2进来之后,A---->B出栈D、C、A压栈;此时链表的结构发生了变化;A---->C---->D;此时线程1发现栈顶元素还是A,而元素B被出棧之后成为一个游离的对象
解决方式:由于CAS算法没有直接的使用锁;而是通过乐观锁的方式去控制并发的;而对于乐观锁而言一般都是操作+时间戳来控制每一次的版本号的;在JDK类库中,可以使用AutomicStampReference来解决
梦是愿望的达成要想解释这个梦,就要看你近两天干了什么遇到了什么事。这样解释起来才科学合理!
你对这个回答的評价是
你与佛有缘,有人要渡你切忌不可做歹事,存善心等待机缘
你对这个回答的评价是?
你对这个回答的评价是
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。