连初级都算不上的代码小白 2024-03-15 22:16 采纳率: 52.4%
浏览 27

线程池任务在try外还是内

//如果数据过期则返回旧数据并获取互斥锁开启新线程重建缓存
        Boolean isLock = tryLock(LOCK_SHOP_KEY + id, 30l, TimeUnit.SECONDS);
        //获取锁成功
        if (isLock) {
            log.error("成功获取锁");
            try {
                CACHE_REBUILD_EXECUTOR.submit(() -> {
                    saveShop2Redis(id, 10l);
                });
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            finally{
            unLock(LOCK_SHOP_KEY + id);
            }
        }
        return shop;
 boolean isLock = tryLock(lockKey,30l, TimeUnit.SECONDS);
        // 6.2.判断是否获取锁成功
        if (isLock){
            CACHE_REBUILD_EXECUTOR.submit( ()->{

                try{
                    //重建缓存
                    this.saveShop2Redis(id,10L);
                }catch (Exception e){
                    throw new RuntimeException(e);
                }finally {
                    unLock(lockKey);
                }
            });
        }
        // 6.4.返回过期的商铺信息
        return shop;

仔细看这两段代码的差异、下面的对

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-03-15 22:17
    关注

    连初级都算不上的代码小白 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    这两段代码的差异在于锁的释放位置和异常处理的方式。对于第一段代码:

    1. 的获取和释放均在try-catch语句块的外部进行,无论是否成功获取锁都会执行释放锁的操作。这可能导致锁的提前释放,从而使其他线程获取到锁执行缓存重建操作,并发生竞争问题。
    2. 异常处理部分使用了try-catch语句块捕获异常,并使用了RuntimeException重新抛出异常。

    对于第二段代码:

    1. 锁的获取和释放均在try-finally语句块中,保证锁的释放一定会执行,无论是否成功获取锁。
    2. 异常处理部分使用了try-catch语句块捕获异常,并在finally语句块中释放锁。这样可以避免因为异常而导致锁未被释放的情况发生。

    解决方案:

    1. 在try-finally语句块中释放锁可以确保锁一定会被释放,建议采用第二段代码的方式进行处理。
    2. 对于异常的处理,建议根据具体的业务逻辑进行相应的处理,比如记录日志,返回错误信息等。

    修改后的代码如下:

    boolean isLock = tryLock(lockKey, 30l, TimeUnit.SECONDS);
    try {
        if (isLock) {
            CACHE_REBUILD_EXECUTOR.submit(() -> {
                try {
                    // 重建缓存
                    saveShop2Redis(id, 10L);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    unLock(lockKey);
                }
            });
        }
    } catch (Exception e) {
        // 异常处理
        throw new RuntimeException(e);
    }
    
    return shop;
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月15日