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

  • 相关阅读:
    MYSQL索引
    Objective-C:KVO
    iOS UIKit:viewController之动画(5)
    iOS UIKit:viewController之Segues (4)
    iOS UIKit:viewController之Present (3)
    iOS UIKit:viewController之定义(2)
    iOS UIKit:viewController之层次结构(1)
    iOS UIKit:view
    iOS UIKit:App
    Objective-C:Block
  • 原文地址:https://www.cnblogs.com/kyousuke/p/14597503.html
Copyright © 2011-2022 走看看