帮我解决我的简单问题。这是我的简单例外。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
似乎是运行时异常,因此您似乎没有传播异常,因此一旦抛出异常,您似乎不会在任何地方共享异常的状态。
如果是这种情况,我建议您保持异常非线程安全。
添加回答
举报
0/150
提交
取消