悲观锁和乐观锁

其实悲观锁和乐观是一种思想,

所谓悲观锁:就是默认,每次别人去拿数据的时候都会进行修改,所以每次拿数据都会上锁,防止数据出错。

      因此,有别的线程想要拿这个数据的时候,就会堵塞,直到他拿到锁。

      java的synchronized就是很典型的一个悲观锁实现。

      悲观锁的好处:数据是都是正确的,例如高并发问题,超卖的问题可以完美的解决。

      但缺点也很多,多线程同时去抢锁的时候,会导致有些用户堵塞很久。

所谓乐观锁:就是默认每次别人拿数据的时候都不会进行修改,但是要更新数据的时候,会进行比对。

      举个例子,在商品表里加入一个version字段,当秒杀抢购的时候,线程A会先获取数据,然后更新商品的库存的时候,线程A把获取到的数据的version和数据库里商品的version进行比对

      例如获取到的version是1,正好数据库里的version也是1,那么说明这段时间里没人操作过数据,可以修改。然后线程A在update商品库存的时候,让version+1。

      假如线程B在A获取数据的时候,同时也获取了数据库的数据,version也是1,但它要更新数据库的时候,A线程已经update了version,这时候B查出来的version是2,那么B线程就不能进行更新

      因为数据是不正确的,只能重新获取数据。

      乐观锁的好处:合适多读的应用场景,可以适应高的吞吐量。

 

posted @ 2021-10-14 16:20  hickup  阅读(52)  评论(0编辑  收藏  举报