基于Synchronized锁解决超卖问题(方法锁与块锁)

Synchronized锁主要有方法锁和块锁

方法锁

在方法前加入synchronized关键字,并在方法内使用手动事务,确保事务被提交后,其他线程才可以进入。
否则,若使用注解事务,则会导致第一个线程还未提交事务,此时第二个线程已经进来做库存校验等操作,会导致超卖现象。在这里插入图片描述

块锁

块锁即是在方法中,对指定的操作进行加锁,确保该操作具有原子性。哪个线程抢占到对象就先执行。
在该锁中需要传入一个表达式。这个表达式只要有三种写法

  1. this,表示该service实例,而该service是由spring实例化的,是一个单例。
  2. 在类里面创建一个Object,然后传入object,与this一样的。因为service是一个单例,那么里面创建的对象也是单例。
  3. 前面都是对象锁,那么传入class(OrderService.class)的话就是类锁了,对象是由类new出来的,如果Service不是单例的,在多个地方有实例化,那么就会有多个对象,有可能有多个线程去争抢多个Service,这个时候就会产生并发的情况了。那类的锁,只能有一个线程去获得。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_31776219/article/details/113780556