【Java并发编程】2、无锁编程:lock-free原理;CAS;ABA问题
2017-02-27 00:23
645 查看
转自:http://blog.csdn.net/kangroger/article/details/47867269
CAS是一个原子操作,用于多线程环境下的同步。它比较内存中的内容和给定的值,只有当两者相同时(说明其未被修改),才会修改内存中的内容。
实现如下:
或
返回bool值得好处是可以知道是否设置成功。
在实际环境中,使用的是:
在使用CAS时,需要先获取操作变量的值并放到oldval中,之后调用cas函数,直到调用成功。例如给变量val赋值
假设有两个线程P1和P2,P1执行完
参考:
Compare-and-swap
ABA problem
定义
无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避免竞态、死锁等问题。原理
CAS是指Compare-and-swap或Compare-and-SetCAS是一个原子操作,用于多线程环境下的同步。它比较内存中的内容和给定的值,只有当两者相同时(说明其未被修改),才会修改内存中的内容。
实现如下:
int compare_and_swap(int* reg, int oldval, int newval) { ATOMIC(); int old_reg_val = *reg; if (old_reg_val == oldval) *reg = newval; END_ATOMIC(); return old_reg_val; }
或
bool compare_and_swap(int *accum, int *dest, int newval) { if (*accum == *dest) { *dest = newval; return true; } else { *accum = *dest; return false; } }
返回bool值得好处是可以知道是否设置成功。
在实际环境中,使用的是:
bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...) type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
在使用CAS时,需要先获取操作变量的值并放到oldval中,之后调用cas函数,直到调用成功。例如给变量val赋值
while(true) { int oldval=val; if(__sync_bool_compare_and_swap(&val, oldval, newval)) break; }
ABA问题
在多线程环境中,使用lock-free的CAS时,如果一个线程对变量修改2次,第2次修改后的值和第1次修改前的值相同,那么可能就会出现ABA问题。以上面的例子为例:假设有两个线程P1和P2,P1执行完
int oldval=val后被其他线程抢占。P2线程在此期间修改了val的值(可能多次修改),但最终val的值和修改前一样。当P1线程之后运行CAS函数时,并不能发现这个问题。这就是ABA问题。
解决方法
一个常用的方法是添加额外的“tag”或“stamp”位来标记是指针是否被修改过。参考:
Compare-and-swap
ABA problem
相关文章推荐
- 无锁编程:lock-free原理;CAS;ABA问题
- Java并发编程笔记 Native方法,CAS操作与ABA问题
- 【Java并发编程】15、ReentrantLock实现原理深入探究
- Java并发学习(十)-CAS中ABA问题解决方法
- java并发编程之:ReentrantLock实现原理与深入研究
- Java 并发与多线程规范(4) 自旋锁是可重入的吗?CAS与自旋锁的关系,CAS的ABA问题,以及乐观锁,悲观锁,互斥锁,读写锁的整理
- 聊聊高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference源码来看如何解决CAS的ABA问题
- 【转】Java多线程编程(十)-并发编程原理(分布式环境中并发问题)
- 谈论高并发(十二)分析java.util.concurrent.atomic.AtomicStampedReference看看如何解决源代码CAS的ABA问题
- 【Java并发】- ReentrantReadWriteLock,读写锁原理
- Java多线程编程(六)-并发编程原理(Java存储模型和共享对象)
- Java并发编程:Lock(转载)
- Java多线程编程(八)-并发编程原理(Java多线程开发技巧)
- Java并发编程:Synchronized及其实现原理
- Java并发编程:Lock
- Java并发编程之CAS
- java并发编程-线程同步-显示锁ReentrantLock
- Java 并发编程:volatile的使用及其原理(转)
- Java 多线程并发编程之互斥锁 Reentrant Lock
- Java并发编程之二十:并发新特性—Lock锁和条件变量(含代码)