笔记-3、原子操作CAS1

preview
需积分: 0 1 下载量 177 浏览量 更新于2022-08-08 收藏 15KB DOCX 举报
在Java编程中,原子操作(Atomic Operation)是并发编程中的一种重要概念,它指的是在多线程环境下,某个操作能够不被其他线程中断,保证其完整性。这在并发编程中至关重要,因为线程间的相互干扰可能导致数据不一致或者死锁等问题。在Java中,通过JDK提供的原子类,我们可以实现基于比较并交换(Compare and Swap,简称CAS)的原子操作。 CAS操作是一种无锁算法,其核心思想是:如果内存位置V的值等于预期值A,则将内存位置V的值更新为B,否则不做任何操作。这个过程在单个操作中完成,因此被称为原子操作。这个操作通常由硬件层面支持,保证了其不可分割性。 在Java中,CAS操作通常用在循环中,即所谓的自旋锁(Spin Lock)。当一个线程尝试更新共享变量但发现当前值与预期不符时,它会进入一个循环,不断尝试直到成功。这种自旋等待避免了线程被挂起,提高了响应速度。但是,如果存在大量线程竞争,或者一个线程长时间持有锁导致其他线程一直自旋,那么CPU资源会被过度消耗,可能导致性能下降。 描述中提到的"版本号: A1B2-A3",可以理解为在并发更新过程中,变量的版本号会随着CAS操作而改变。例如,初始版本为A1,然后被线程修改为B2,接着另一个线程试图恢复为A,但由于版本已变,CAS失败,所以版本变为A3。这种情况可能导致循环,也就是所谓的"ABA问题",即一个值被改变,然后又变回原值,但中间可能发生了其他操作,使得系统状态发生不可预知的变化。 为了解决ABA问题,Java提供了一些特殊的原子类,如`AtomicMarkableReference`和`AtomicStampedReference`。`AtomicMarkableReference`在引用对象的基础上添加了一个可原子性设置的标记位,可以用来检测变量是否被修改过。而`AtomicStampedReference`则增加了版本号或称为“戳记”,每次更新都伴随着版本号的递增,这样就可以检查是否发生了中间变化,从而避免ABA问题。 CAS操作是Java并发编程中一种高效的锁机制,它可以减少线程上下文切换的开销,提高程序性能。然而,它也存在一定的局限性,如ABA问题和自旋导致的CPU资源浪费。开发者需要根据具体场景选择合适的同步策略,合理利用这些原子操作类,以实现高效且安全的并发代码。
琉璃纱
  • 粉丝: 22
  • 资源: 298
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜