微信搜索《Java鱼仔》,每天一个知识点不错过
(一)每天一个知识点
什么是乐观锁、什么是悲观锁,两种锁在Java中的具体应用场景有哪些?
(二)结论
乐观锁和悲观锁不是两种具体的锁,而是一种观念。
乐观锁:乐观锁认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为,不加锁的并发操作是没有事情的
悲观锁:悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。
乐观锁的应用场景:CAS操作是一种典型的乐观锁,使用CAS操作可以在没有锁的情况下完成多线程对一个值的更新。
悲观锁的应用场景:对于写入操作比较频繁的场景,就需要用到悲观锁,java中的synchronized锁就是一种悲观锁,synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块。
(三)再多学一点
CAS:compare and swap,比较且交换。使用CAS操作可以在没有锁的情况下完成多线程对一个值的更新。CAS的具体操作如下:
当要更新一个值时,先获取当前值E,计算更新后的结果值V(先不更新),当要去更新这个值时,比较此时这个值是否还是等于E,如果相等,则将E更新为V,如果不相等,则重新进行上面的操作。
以i++操作为例,在没有锁的情况下,这个操作是线程不安全的,假设i的初始值为0,CAS操作先获取原值E=0,计算更新后的值V=1,要更新之前先比较这个值是否还是等于0,如果等于0则将E更新为1,如果不等于0则说明有线程已经更新了,重新获取E值=1,继续执行。