悲观锁
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所有每次拿数据时都会上锁,这样别人想要拿这个数据时就会阻塞。如Java中的synchronized。适用于写操作较多的场景。
乐观锁
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所有不会上锁,但在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用CAS算法实现。适用于读操作较多的场景。
乐观锁实现方式
CAS算法
内存值V、预期值A、新值B
当V的值==A时,CAS通过原子方式用新值B来更新V值
cas的ABA问题 :
如果一个变量V的初次读取的时候是A值,并且在准备赋值时仍是A值,但这并不能说明他的值没有被其他线程修改过。
J.U.C提供了AtomicStampedReference,主要加上版本号解决的。