事务内存:软件与硬件实现解析
1. 无阻塞原子对象实现
在事务内存中,无阻塞原子对象的实现是一个重要的部分。以 FreeObject 类为例,它是一个无阻塞原子对象的实现。
当线程A完成一个对象的写入后,在切换由线程B最后写入的第二个对象的副本时,会准备一个新的定位器(locator),该定位器包含对象的新副本和一个指向线程B定位器新字段的旧对象字段,然后使用 compareAndSet() 方法将对象引用切换到新创建的定位器。
每个事务能观察到一致状态的原因在于:当事务A调用getter方法读取对象字段时,会将自身设置为对象的所有者。若对象已有活跃所有者B,A会中止B,然后将字段值读入局部变量。在getter将值返回给应用程序之前,会调用 validate() 方法检查值的一致性。若有其他事务C取代A成为对象所有者,C会中止A,A的验证将失败。因此,若setter返回一个值,该值是一致的。
事务可序列化的原因是:若事务A成功将其状态从 ACTIVE 变为 COMMITTED ,它必须仍然是所有访问对象的所有者,因为任何篡夺A所有权的事务必须先中止A。所以,A读取或写入的对象自其访问后都未改变,A实际上是在更新其访问对象的快照。
FreeObject 类的具体实现如下:
public class FreeObject<T extends Copyable<T>>
超级会员免费看
订阅专栏 解锁全文
172万+

被折叠的 条评论
为什么被折叠?



