博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AtomicMarkableReference源码解析
阅读量:4210 次
发布时间:2019-05-26

本文共 859 字,大约阅读时间需要 2 分钟。

之前在说CAS的时候说过ABA问题,ABA问题就是在多线程情况下,其他线程修改了共享变量,但最终共享变量的值并没有发生变化。以至于当前线程无法辨别共享变量是否已经发生了变化。为了使得线程之间能够判断共享变量是否被其他线程修改,办法就是给在操作共享变量的时候添加标识。通过判断这个标识来判断是否共享变量被其他线程修改了。在java的JUC工具包中,提供了两种方式来对ABA问题进行解决,其中一类是判断共享变量是否中途被其他线程修改,采用的是布尔变量的方式。另一种是采用int类型的变量,从而使得CAS的判断条件更加灵活,也更加适合实际情况。下面分别介绍这两种方式。

AtomicMarkableReference

上边的程序简单的表达了AtomicMarkableReference的使用方式。下边我们看看AtomicMarkableReference的源码设计

首先是volatile变量pair,AtomicMarkableReference通过内部类的方式将pair进行封装,采用T变量的模式兼容所有类型的数据,在pair中有变量mark,mark就是用来判断数据是否被修改的判断标志。

由于pair是volative修饰的,因此所有的对数据的读操作均采用pair。

在进行设置值的时候,采用我们熟悉的compareAndSet方法。首先判断旧的值和新的值是否相同,并判断mark的标志是否相同。如果数据均未发生变化,那么就不执行set,否则采用casPair方法进行赋值操作。

在casPair方法中,直接采用sun提供的Unsafe进行CAS操作。但是首先我们要明白的是,pairOffset的意义,由于在我们实类化时候采用真实的是AtomicMarkableReference,也就是说我们的数据实际上是位于AtomicMarkableReference对象中的pair中,因此这里在AtomicMarkableReference初始化的时候获取pair中其中的内存偏移量。从而在小范围内进行CAS自旋赋值。

转载地址:http://cmkmi.baihongyu.com/

你可能感兴趣的文章
ORA-00600:[32695], [hash aggregation can't be done] 解决方法
查看>>
Oracle SQL中使用正则表达式 执行报ORA-07445 [_intel_fast_memcpy.A()+10] 错误
查看>>
Oracle TABLE ACCESS BY INDEX ROWID 说明
查看>>
ORA-00600 [kmgs_parameter_update_timeout_1], [27072] ORA-27072 解决方法
查看>>
Oracle 11g alert log 新增消息 opiodr aborting process unknown ospid (1951) as a result of ORA-28 说明
查看>>
Linux Context , Interrupts 和 Context Switching 说明
查看>>
《Oracle数据库问题解决方案和故障排除手册》终于发售了
查看>>
Oracle alert log ALTER SYSTEM SET service_names='','SYS$SYS.KUPC$C_...' SCOPE=MEMORY SID='' 说明
查看>>
Oracle latch:library cache 导致 数据库挂起 故障
查看>>
Openfiler 配置 NFS 示例
查看>>
Oracle 11.2.0.1 RAC GRID 无法启动 : Oracle High Availability Services startup failed
查看>>
Oracle 18c 单实例安装手册 详细截图版
查看>>
Oracle Linux 6.1 + Oracle 11.2.0.1 RAC + RAW 安装文档
查看>>
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明
查看>>
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>