版本号机制和CAS算法实现乐观锁

  • 乐观锁
  • CAS
  • 版本号机制
大约 2 分钟

1.版本号机制

check-and-set

在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。

当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

乐观锁在进行版本修改时是需要原子性的。

2.CAS算法

compare and swap 比较并交换

当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS是一种非阻塞式的同步方式。

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。CAS指令执行时,比较内存地址V与预期值A是否相等,若相等则将B赋给A,(不相等则会循环比较直到相等)整个比较赋值操作是一个原子操作。

CAS有三个缺点

1、CAS自旋操作:当内存地址V与预期值B不相等时会一直循环比较直到相等,

2、只能保证一个共享变量的原子操作,

3、出现ABA问题:如果内存值初V次读取的时候为A,在将要赋值的时候再次检查还是A,能说明V没有改变过吗?

上次编辑于: