版本号机制和CAS算法实现乐观锁
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没有改变过吗?