1.CAS是什么
Compare and Swap(比较并操作),由处理器架构支持,语义是如果当前值V和旧值A相同,则将当前值修改为B,如果不相同则不修改。CAS操作采用的是乐观锁技术,当多线程同时修改某个变量时只有一个成功,其他线程会失败当是不会被挂起,会被告知失败并重试。
2.CAS操作和synchronized有什么区别呢
synchronized关键字采用悲观锁技术,线程独享锁,其他线程会被挂起知道锁被释放线程恢复,挂起和恢复会有很大的开销。
3.java中CAS操作有哪些
java1.5之后引入了对CAS操作的底层支持,比如在intel的CPU中使用的是cmpxchg指令。java.util.concurrent.atomic中的AtomicXXX都使用了CAS操作,比如AtomicInteger的getAndIncrement方法来实现i++的原子的复合操作。举例说明实现一个无锁数据结构(非阻塞算法):
实现一个单链表栈,栈顶A,A.next为B,需要将A出栈。两个线程同时操作head.compareAndSwap(A,B),线程T1比较栈顶的当前值和旧值均为A则将A改为B,线程T2看到栈顶的当前值为B和旧值A不同则什么都不做。这就实现了无锁的堆栈。
4.ABA问题的解决方案
无锁的数据结构中存在一个ABA的问题,如果线程T1经过一系列的操作后将栈变为A->C->D,那么T2经过比较后仍然会将栈变为B,会将C和D丢失掉。
解决ABA问题的某些算法中会记录数据变换的过程,可以通过一个版本号来记录,A变成B再变成A和没有任何操作是的版本号是不同的。
java中AtomicStampedReference和AtomicMarkableReference实现了解决ABA的问题。AtomicStampedReference会使用一个Pair来保存引用和计数器。每次操作前不但会比较引用值还会比较计数器值,完成操作后会更新计数器的值。AtomicMarkableReference使用Pair来保存引用和布尔类型的标记值。AtomicStampedReference可查看引用的改变次数,AtomicMarkableReference只关心有没改变
java中你所不知道的CAS操作
时间: 2025-01-17 01:35:53
java中你所不知道的CAS操作的相关文章
JavaScript中你所不知道的Object(二)--Function篇
上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.String.Function等有更多的内部属性,而它们分别是什么呢? 这些内部属性不能像Object的内部属性一样一言以蔽之,因为它们各有各的用处和特点.其中核心的部分自然是最特殊的对象,Function对象.我们先从简单的开始: [[PrimitiveValue]]: 值的类型是基础数据类型.所以所有
JAVA重载(overload)和覆盖(override)中你所不知道的陷阱
大家都知道重载是指在同一个类中,定义了有相同名称但是有不同参数类型的方法时,到底调用那一个方法会根据参数类型来选择.我们来看下面这个例子: public class ParentClass { } public class ChildClass extends ParentClass{ } public class Test { public void testOverLoad(ParentClass cls){ System.out.println("It's ParentClass"
Go基础之--位操作中你所不知道的用法
之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & 1 = 11 & 0 = 00 & 1 = 00 & 0 = 0 或操作:!1 | 1 = 11 | 0 = 10 | 1 = 10 & 0 = 0 异或:^1 ^ 1 = 01 ^ 0 = 10 ^ 1 = 10 ^ 0 = 0 左移:<<1 << 1
KVO中你所不知道的";坑";
一.什么是 KVO 首先让我们了解一下什么KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.键值观察Key-Value-Observer就是观察者模式. 观察者模式的定义:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的.观察者模式较完美地将目标对象与观察者对象解耦. KVO和KVC没有什么关系,要说有关系的话也就是--K
浅谈在网页中你所不知道的css背景属性
在很多网页设计中,很多人对于css的背景属性,只是停留在设置背景.今天我们来谈谈它的其他应用. 比如背景的定位,它能实现很多翻转网页效果. background-position:指定背景图像的位置background-size 指定背景图片的大小background-image 指定要使用的一个或多个背景图像background-repeat 指定如何重背景图像background-origin 指定背景图像的定位区域background-clip 指定背景图像的绘画区域background-
Android中Context详解 ---- 你所不知道的Context
转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好, 今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context
Android中Context详解 ---- 你所不知道的Context (转载)
Android中Context详解 ---- 你所不知道的Context (转载) http://blog.csdn.net/qinjuning 大家好, 今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用
Android中Context详解 ---- 你所不知道的Context(转)
Android中Context详解 ---- 你所不知道的Context(转) 本文出处 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好, 今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打
你所不知道的五件事情--java.util.concurrent(第二部分)
这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,仍然讲述了关于Java并发集合API的一些应用窍门,值得大家学习.(2010.06.17最后更新) 摘要:除了便于编写并发应用的集合API外,java.util.concurrent还引入了其它的预置程序组件,这些组件能辅助你在多线程应用中控制和执行线程.Ted Neward再介绍了五个来自于java.util.concurrent的Java编程必备窍门. 通过提供线程安全,性能良好的数据结构,并发