在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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?