为了账号安全,请及时绑定邮箱和手机立即绑定

Java Extends RuntimeException 字段值是线程安全的吗?

Java Extends RuntimeException 字段值是线程安全的吗?

qq_笑_17 2021-08-04 17:30:16
帮我解决我的简单问题。这是我的简单例外。public class MyException extends RuntimeException {private MyErrors error;public MyException() {}public MyException(String message) {    super(message);}public MyException(MyErrors error) {    super(error.getMessage());    this.error = error;}}    public class MyService {...    public String someMethod(String id){        Optional<Prizes> prize = Optional.ofNullable(prizesRepository.findById(id));        if(prize.isPresent()){            return prize.get().getPrize();        }        throw new MyException(ThanksGivenErrors.BadRequest);    }}这是 MyController 使用的 MyServicepublic class MyController{...@PostMapping("/prize")public ResponseEntity findPrize(@RequestParam String id) {    try {        return new ResponseEntity<>(MyService.someMethod(id), HttpStatus.OK);    } catch (MyException e) {        return new ResponseEntity<>(e.getError().getMessage(), HttpStatus.BAD_REQUEST);    }}}MyService 是一个 Spring bean 和单例。我认为如果在多线程环境中使用 MyService 并且发生许多 MyException,则 MyException 中 'error' 字段的值可能会发生变化。“MyException(extends RuntimeException)”的字段值是“线程安全”吗?我不认为这会是安全的。谢谢你的教导。
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

正如评论者所提到的,您可以通过使用final关键字使您的异常成为线程安全的,假设它MyErrors也是线程安全的。

但是,您应该注意,您担心的是

如果在多线程环境中使用 MyService 并且发生许多 MyException,则 MyException 中“错误”字段的值可能会更改。

在这里无效。您的异常不需要是线程安全的,因为即使抛出异常,它也只会对抛出线程可用。由于MyException似乎是运行时异常,因此您似乎没有传播异常,因此一旦抛出异常,您似乎不会在任何地方共享异常的状态。

如果是这种情况,我建议您保持异常非线程安全。


查看完整回答
反对 回复 2021-08-04
?
富国沪深

TA贡献1790条经验 获得超9个赞

RuntimeException扩展自Throwable,它不是线程安全的或不可变的。它具有更改状态的方法,例如: addSuppressed


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 307 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信