zoukankan      html  css  js  c++  java
  • 使用String常量作为synchronized的锁 优化同步锁

    public synchronized OrderBOResult addOrder(OrderParam orderParam)

    一般来说这样加锁可以保证 同一时间只有一个线程能使用这个方法,但是如果这样做 直接导致了 一个多线程项目变成了 一个单线程项目

    所有我们可以 用一个常量来保证只有相同String 的请求才会 被锁

    private static final Interner<String> pool = Interners.newWeakInterner();

    @ApiOperation("接单")
    @ApiResponses({
    @ApiResponse(code = 200, message = "OK", response = AppUser.class)
    })
    @AvoidRepeatableCommit
    @PostMapping("/doDeviceOrder")
    public Ajax doDeviceOrder(@Validated DoDeviceOrderDto dto) {
    try {
    deviceOrderService.idCard(getCurrentUser().getId());
    synchronized (pool.intern(dto.getOrderNo())){
    return deviceOrderService.doDeviceOrder(dto, getCurrentUser());
    }
    } catch (Exception e) {
    e.printStackTrace();
    logger.error(e.getMessage());
    return Ajax.faild(e.getMessage());
    }
    }

     synchronized块锁住不同对象的时候,同步块里是不会阻塞的。

    但是这种是单机部署才可以是用的如果你是集群部署 则需要使用 redis 的分布式锁

    redisTemplate.opsForValue().setIfAbsent("key","value",timeout,unit); 分布式锁

    部分参考博客:https://www.cnblogs.com/fswhq/p/11260896.html

  • 相关阅读:
    __name__使用方法,模块查找顺序和模块的绝对导入
    模块
    ATM程序结构
    迭代器
    常用内置方法
    生成式,匿名函数及内置函数部分使用方法
    算法之二分法和三元表达式
    redis配置文件
    PythonStudy——shutil 模块
    PythonStudy——pickle 模块 (泡菜)
  • 原文地址:https://www.cnblogs.com/kyousuke/p/14597503.html
Copyright © 2011-2022 走看看