在系统中有一些数据是大多数线程都会访问的,这个时候就会产生竞争。例如库存。商品库存主要的库存的要求:首先是无论怎么减都不能小于0,第二点是尽可能的高效。
实现方式一:对于不能小于0,可以通过sql命令来实现。
update account
set
count = count -1
where name = "cloth" AND count>0
这样一条命令能够实现保证count数不会小于一。但是在数据库里update时会加锁,当大量的线程过来的时候,就会变成是单线程的。影响系统的横向扩展。
第二种方式:无锁的方式是每一次扣库存的时候并不减库存,而是王数据库里写一条扣的交易记录。然后找一个时间点刷新库存。
系统启动的时候,读取到商品的库存主要是通过库存+库存消耗信息
计算出库存。将库存使用Atomic变量stock表示库存。使用一个Atomic值cost表示消耗数量。
当扣减的时候,首先往数据库中插入写入一条消耗的信息。然后将cost+1.然后检查 stock+cost <0
如果小于0添加一条补偿的记录进去。
这里先扣然后检查余量如果非法再加回去的做法可能会出现错报库存不足的情况。例如库存 = 10,ThreadA扣了11个,Thread扣B了9个。在ThreadA写补偿记录的时候ThreadB也会写入补偿记录。导致两个线程都扣库存失败。但是不会出现余额为负的情况。换个思路,这个商品如此受欢迎,先提前拒绝一些线程也是可以接受的。
数据结构&#