在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
关注
打赏
热门博文
- Flutter之Widget构建过程详解
- Flutter之Widget 更新机制原理浅析
- 从源码角度分析android事件分发处理机制
- android事件拦截处理机制详解
- android 获取IP地址
- android 获取生肖和星座
- Android TextView setCompoundDrawables设置图片不显示解决方案
- Android Stuido集成LeakCanary编译失败TransformException、transformClassesWithDexBuilderForDebug
- Flutter实战之go_router路由组件入门指南
- HarmonyOS鸿蒙学习笔记(9)Navigator组件实现页面路由跳转