应用场景
用户账户存在余额,用户在充值的时候也在消费,在充值或者消费过程中,若交易过程没有线程控制,则可能造成充值失败,余额对不上。
比如充值时余额为100,消费金额10,充值金额100;消费时获取余额100,充值获取余额100,充值完成200,消费10,余额变成90,覆盖充值记录最终余额变成90。充值失败。
对交易接口加锁可以解决,但会影响到所有用户的交易过程,严重影响效率。若每个用户有自己的锁,对用户自身进行加锁,则既可解决同用户并发交易失败问题,也可解决不同用户并发的效率问题。
下边实现了一个锁容器,交易时首先从容器中获取到锁后,方可进行交易。
package com.shentb.hmb.commom.concurrent;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 单实例锁容器
*/
public class LockContainer {
private LockContainer() {
}
/**
* 锁容器
*/
private Map<Integer, Object> sellerLockMap = new HashMap<>();
/**
* 延迟创建锁
* @param sellerid
* @re