乐观锁:
概念:悲观想法,每次去拿数据的时候都会认为别人会进行修改,所以在每次拿数据的时候都会进行上锁。这样别人想要拿数据的时候就会被挡住,直至悲观锁被释放,悲观锁中的额共享资源每次都只能给一个线程使用,其他线程堵塞,直至用完后再将资源转让给其他线程。
效率:处理加锁解锁的机制会额外产生开销,还会增加产生死锁的机会。另外还会降低并行性,如果已经锁定至线程A,其他线程都需要等待该线程A处理完,方才可以进行处理。
锁:行锁、表锁、连锁(共享锁)、写锁(排他锁),以及使用syncronized实现的锁均为悲观锁。
乐观锁:
概念:乐观想法,每次拿数据都认为别人不会进行修改数据,所以每次拿数据时都不会上锁。但如果想要更新数据,则会在更新数据前检查读取至更新这段时间内别人是否有修改这个数据。若修改了,则重新读取,并再次尝试更新,循环上述步骤直至更新成功(当然也存在更新失败的线程放弃更新操作的),乐观锁适用于多读少操作的应用类型,提高吞吐量。
比较:相对于悲观锁,在对数据操作时,乐观锁不会对数据库进行加锁的机制,而是使用记录数据版本号活时间戳来实现,一版版本记录使用较多。乐观锁一版不会产生任何锁和死锁的。
使用场景:
乐观锁的注意点:
如果一个变量的值读取时是A,在准备修改的时候还是A,那么我们能够说明它没有被其他线程进行修改过么?
显然不能,有可能被多个线程进行修改,最后一个线程又被修改了回来。这个时候我们应该怎么做?根据时间戳和版本号进行判断,我们优选版本号,在每次操作时都将版本号+1,每次进行操作时根据值和版本号进行判断!