自定义多线程业务加锁同步范围

在涉及到多线程并发处理业务时,如果有修改公共资源的时候,往往存在着线程安全问题,这时我们往往会使用一些方法来避免线程不安全,例如:使用lock加锁,synchronized同步这些悲观锁或者使用版本号等乐观锁;

 

如果这时候有这么个需求,一个业务是各公司提交修改公司销售额;这时其实并发修改的是各公司的销售表,如果同步整个方法可能性能稍微降低;如果时候乐观锁可能出现并发时某些修改失败的问题,当然如果使用重试机制,在高并发时可能也会导致性能下降;这时我们可以使用控制同步各公司的方式,使不同公司间并发修改互不影响的解决方案,大致实现如以下:

1.控制层:

@RestController
public class SyncParam {

    //定义一个容器用于存储 公司及对应的锁
    private static Map<String, Lock> map = new ConcurrentHashMap<>();

    @Autowired
    SyncParamService syncParamService;

    @GetMapping("lockByName")
    public Object test(String lockName) {
        //每次收到请求时,拿出公司对应的锁
        Lock o = map.putIfAbsent(lockName, new ReentrantLock());
        if (o == null) {
            o = map.get(lockName);
        }
        return syncParamService.test(o);
    }
}

2.业务层:

@Service
public class SyncParamService {

    public Object test(Lock lock) {
        try {
            //对业务加锁
            lock.lock();

            //todo somethings

            return "成功";
        } finally {
            //完成后释放锁
            lock.unlock();
        }
    }
}

 

以上也可以使用synchronized 同步代码块的方式,对各公司对应的对象进行同步操作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值