在java线程知识点拾遗(CAS)这篇文章中简单的介绍了cas的概念,但是普通的cas是有一个非公平的问题,多个线程需要共享资源的时候可能造成忙等待问题,一言以蔽之就是可能后请求共享资源的线程可能比先请求资源的线程优先获取到资源。 用个例子来说明cas的非公平性,代码如下:
public class UnFairCasLock implements Runnable {
private AtomicBoolean V = new AtomicBoolean(true);
private boolean A = true;
private boolean B = false;
@Override
public void run() {
lock();
PrintUtils.println("服务员为"+Thread.currentThread().getName()+"打菜中");
ThreadUtils.sleep(2000);
unlock();
}
//模拟自旋
private void lock() {
while (!V.compareAndSet(A, B)) {
// 加一个sleep操作,防止while循环过快执行
ThreadUtils.sleep(1000);
}
}
private void unlock() {
V.compareAndSet(B, A);
}
然后初始化多个线程来访问,用来模拟食堂服务员打菜的逻辑:
public static void main(String args[]) {
UnFairCasLock unFairCasLock = new UnFairCasLock();
char name='A';
for(int i=1;i
关注
打赏