文章目录
乐观锁 / 悲观锁
概念
乐观锁、悲观锁不是一种锁的具体实现,而是两种不同的思想。
乐观锁:认为每次去拿数据的时候,别人都不会修改这个数据,(即认为数据一般不会产生冲突),所以不会对数据上锁,只是当对数据进行修改时,才会对数据检测是否冲突,如果发生冲突,返回给用户错误信息,由用户自己决定如何做。
悲观锁:总是假设总坏的情况,认为每次去拿数据时,这个数据都会被别人改变,所以在每次拿数据的时候,都会加锁,这样如果有另一个线程来拿这个数据的时候就会阻塞,直到当前线程释放锁。
乐观锁的实现:CAS(Compare and Swap)操作
CAS是乐观锁的技术实现,当多个线程尝试使用CAS同时来更新同一个变量时,只有一个线程能够更新变量的值,而其他线程都会更新失败,但是失败的线程并不会阻塞,而是被告知这次竞争失败,可以再去尝试竞争。
CAS操作包含3个操作数:
① V:内存位置。
② A: 需要比较的预期原值。
③ B: 拟写入的新值。
解释一下:就是如果一个线程使用CAS操作去修改一个变量的值时,首先会获取这个变量在内存位置V中的原值A,然后判断当前的值是否跟A相同,如果当前的值跟A相同,则认为没有线程并发处理该数据,则直接将A 更改为 B。如果当前的值和A不相同,则认为有线程并发处理该数据,于是重新获取当前内存位置V的值,再去争抢。