Java中两段含Lambda的persist方法代码有何差异?
两段代码的核心差异分析
这两段代码的核心区别在于data.setComparisonTime(NO_COMPARISON_PERFORMED)的执行时机和运行线程上下文,具体差异如下:
1. 执行时机完全不同
- 第一段代码:调用
persist(data)方法的瞬间,就会立即执行data.setComparisonTime,不管返回的Runnable后续有没有被执行。 - 第二段代码:
data.setComparisonTime只会在返回的Runnable的run()方法被触发时(比如提交到线程池执行、手动调用run())才会执行。
2. 运行的线程上下文不同
- 第一段代码:
setComparisonTime的执行线程就是调用persist的线程(比如主线程、业务处理线程)。 - 第二段代码:
setComparisonTime的执行线程是最终运行该Runnable的线程(比如线程池中的工作线程、异步线程)。
3. 潜在的逻辑影响
- 如果
data是多线程共享对象,第一段代码会提前修改对象状态,可能导致其他线程在Runnable执行前就读取到修改后的值,引发意外的逻辑错误;第二段则只会在Runnable执行时修改状态,避免了这种提前变更的问题。 - 如果
persist调用后,Runnable会被延迟执行(比如放入队列等待调度),第一段的状态修改会立即生效,而第二段的修改会延迟到Runnable实际运行时,这会直接影响依赖data状态的其他业务逻辑。
代码对比
原代码:
private Runnable persist(Data data) { data.setComparisonTime(NO_COMPARISON_PERFORMED); return () -> { ... }; }
重构后代码:
private Runnable persist(Data data) { return () -> { data.setComparisonTime(NO_COMPARISON_PERFORMED); ... }; }
内容的提问来源于stack exchange,提问作者rob-DEV
相关产品推荐
相关产品推荐

