最开始接触到相关的内容应该是从volatile关键字开始的吧,知道它可以保证变量的可见性,而且利用它可以实现读与写的原子操作。。。但是要实现一些复合的操作volatile就无能为力了。。。最典型的代表是递增和递减的操作。。。。

我们知道,在并发的环境下,要实现数据的一致性,最简单的方式就是加锁,保证同一时刻只有一个线程可以对数据进行操作。。。。例如一个计数器,我们可以用如下的方式来实现:
public class Counter {
private volatile int a = 0;
public synchronized int incrAndGet(int number) {
this.a += number;
return a;
}
public synchronized int get() {
return a;
}
}
我们对操作都用synchronized关键字进行修饰,保证对属性a的同步访问。。。这样子确实可以保证在并发环境下a的一致性,但是由于使用了锁,锁的开销,线程的调度等等会使得程序的伸缩性受到了限制,于是就有了很多无锁的实现方式。。。。
其实这些无锁的方法都利用了处理器所提供的一些CAS(compare and switch)指令,这个CAS到底干了啥事情呢,可以用下面这个方法来说明CAS所代表的语义:
public synchronized int compareAndSwap(int expect, int newValue) {
int old = this.a;
if (old == expect) {
this.a = newValue;
}
return old;
}
好吧,通过代码应该对CAS语义的标书很清楚了吧,好像现在大多数的处理器都实现了原子的CAS指令了吧。。
好啦,那么接下来来看看在java中CAS都用在了什么地方了吧,首先来看AtomicInteger类型吧,这个是并发库里面提供的一个类型:
private volatile int value;
这个是内部定义的一个属性吧,用于保存值,由于是volatile类型的,所以可以保证线程之间的可见性以及读写的原子性。。。
那么接下来来看看几个比较常用的方法:
public final int addAndGet(int delta) {
for (;;) {
int current = get();
int next = current + delta;
if (compareAndSet(current, next))
return next;
}
}
这个方法的作用是在当前值的基础上加上delta,这里可以看到整个方法中并没有加锁,这代码其实就算是java中实现无锁计数器的方法,这里compareAndSet方法的定义如下:
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
由于调用了unsafe的方法,所以这个就无能为力了,其实应该能猜到JVM调用了处理器本身的CAS指令来实现原子的操作。。。
基本上AtomicInteger类型的重要方法都是采用无锁的方式实现的。。因此在并发环境下,用这种类型能有更好的性能。。。
上面算是搞定了在java中实现无锁的计数器,接下来来看看如何实现无锁栈,直接贴代码了,代码是从《JAVA并发编程实战》中模仿下来的:
package concurrenttest;
import java.util.concurrent.atomic.AtomicReference;
public class ConcurrentStack<e> {
AtomicReference<node<e>> top = new AtomicReference<node<e>>();
public void push(E item) {
Node<e> newHead = new Node<e>(item);
Node<e> oldHead;
while (true) {
oldHead = top.get();
newHead.next = oldHead;
if (top.compareAndSet(oldHead, newHead)) {
return;
}
}
}
public E pop() {
while (true) {
Node<e> oldHead = top.get();
if (oldHead == null) {
return null;
}
Node<e> newHead = oldHead.next;
if (top.compareAndSet(oldHead, newHead)) {
return oldHead.item;
}
}
}
private static class Node<e> {
public final E item;
public Node<e> next;
public Node(E item) {
this.item = item;
}
}
}
好啦,上面的代码就算是实现了一个无锁的栈,简单吧。。。在并发环境中,无锁的数据结构伸缩性能够比用锁好得多。。。
在提到无锁编程的时候,就不得不提到无锁队列,其实在concurrent库中已经提供了无锁队列的实现:ConcurrentLinkedQueue,我们来看看它的重要的方法实现吧:
public boolean offer(E e) {
checkNotNull(e);
final Node<e> newNode = new Node<e>(e);
for (Node<e> t = tail, p = t;;) {
Node<e> q = p.next;
if (q == null) {
// p is last node
if (p.casNext(null, newNode)) {
// Successful CAS is the linearization point
// for e to become an element of this queue,
// and for newNode to become "live".
if (p != t) // hop two nodes at a time
casTail(t, newNode); // Failure is OK.
return true;
}
// Lost CAS race to another thread; re-read next
}
else if (p == q)
// We have fallen off list. If tail is unchanged, it
// will also be off-list, in which case we need to
// jump to head, from which all live nodes are always
// reachable. Else the new tail is a better bet.
p = (t != (t = tail)) ? t : head;
else
// Check for tail updates after two hops.
p = (p != t && t != (t = tail)) ? t : q;
}
}
这个方法用于在队列的尾部添加元素,这里可以看到没有加锁,对于具体的无锁算法,采用的是Michael-Scott提出的非阻塞链表链接算法。。。具体是怎么样子的,可以到《JAVA并发编程实战》中去看吧,有比较详细的介绍。
另外对于其他方法,其实都是采用无锁的方式实现的。
最后,在实际的编程中,在并发环境中最好还是采用这些无锁的实现,毕竟它的伸缩性更好。
总结
以上是本文关于Java语言中cas指令的无锁编程实现实例的全部介绍,希望对大家有所帮助!
# java
# cas
# 无锁算法
# cas无锁编程
# cas指令
# 谈谈Java类型中ParameterizedType
# GenericArrayType
# TypeVariabl
# WildcardType
# Java基础之常用的命令行指令
# idea ssm项目java程序使用十六进制rxtx包向串口发送指令的方法
# Java中invokedynamic字节码指令问题
# java虚拟机指令dup详解
# 浅谈java指令重排序的问题
# Java字节码指令集的使用详细
# Java加载与存储指令之ldc与_fast_aldc指令
# 来看看
# 都是
# 可以用
# 加锁
# 是从
# 可以看到
# 它可以
# 来实现
# 好啦
# 无能为力
# 的是
# 实现了
# 几个
# 是在
# 见性
# 就算是
# 基础上
# 是怎么
# 数据结构
# 能有
相关文章:
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星上传入口如何快速找到?
山东网站制作公司有哪些,山东大源集团官网?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
潮流网站制作头像软件下载,适合母子的网名有哪些?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
营销式网站制作方案,销售哪个网站招聘效果最好?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
如何正确选择百度移动适配建站域名?
电商平台网站制作流程,电商网站如何制作?
高端网站建设与定制开发一站式解决方案 中企动力
如何快速选择适合个人网站的云服务器配置?
如何撰写建站申请书?关键要点有哪些?
定制建站策划方案_专业建站与网站建设方案一站式指南
如何快速打造个性化非模板自助建站?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
网站制作报价单模板图片,小松挖机官方网站报价?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何用VPS主机快速搭建个人网站?
建站VPS配置与SEO优化指南:关键词排名提升策略
活动邀请函制作网站有哪些,活动邀请函文案?
如何通过VPS建站无需域名直接访问?
如何在IIS中新建站点并解决端口绑定冲突?
如何快速搭建响应式可视化网站?
手机网站制作与建设方案,手机网站如何建设?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
大连网站制作公司哪家好一点,大连买房网站哪个好?
linux top下的 minerd 木马清除方法
如何通过云梦建站系统实现SEO快速优化?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
如何登录建站主机?访问步骤全解析
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
宝塔建站助手安装配置与建站模板使用全流程解析
再谈Python中的字符串与字符编码(推荐)
b2c电商网站制作流程,b2c水平综合的电商平台?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
大连 网站制作,大连天途有线官网?
微信推文制作网站有哪些,怎么做微信推文,急?
建站之星各版本价格是多少?
建站之星在线客服如何快速接入解答?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何在IIS中新建站点并配置端口与IP地址?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
已有域名如何免费搭建网站?
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
*请认真填写需求信息,我们会在24小时内与您取得联系。