乐观锁:
总是认为在读取的时候认为没有其他线程在修改
因此不加锁
但是在修改的时候必须获取锁
也就是多个线程同时修改时,存在锁竞争
锁的实现方式也是自旋锁(CAS)
悲观锁:
总是假设最坏的情况,每次读取都有其他线程在修改数据
因此,每次读取和修改都会加上锁。
CAS操作:
需要读写的内存值V
比较值A
更新值B
如果内存值V和比较值B相等,那么将更新值B写入内存V。
如果一个线程更新成功那么其他线程都会失败,直到该线程主动释放锁为止;
ABA问题:
一些基于CAS的算法受到并且必须处理误报匹配或ABA问题的问题。有可能在读取旧值和尝试CAS的时间之间,一些其他处理器或线程将存储器位置改变两次或更多次,使得它获取与旧值匹配的位模式。如果这个看起来与旧值完全相同的新位模式具有不同的含义,则会出现问题:例如,它可能是循环地址或包装版本计数器