帮我一个简单的问题。
这是我的简单例外。
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使用的MyService
public 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中“错误”字段的值可能会更改。
“ MyException(extends RuntimeException)”的字段值是否是“线程安全的”?
我认为这不会安全。 谢谢您的指导。
答案 0 :(得分:0)
正如评论者所提到的,您可以通过使用final
关键字使您的异常线程安全,并假设MyErrors
也是线程安全的。
但是,您应该注意您的关注
如果在多线程环境中使用MyService并且发生许多MyException,则MyException中“错误”字段的值可能会更改。
在这里无效。不需要异常是线程安全的,因为即使抛出异常,该异常也仅对抛出线程可用。由于MyException
似乎是运行时异常,因此您似乎没有传播该异常,因此看起来一旦抛出该异常,您似乎就不会在任何地方共享它的状态。
如果是这种情况,我建议您将异常保持为非线程安全的。
答案 1 :(得分:0)
RuntimeException 是 Throwable 的扩展,它不是线程安全的或不可变的。它具有更改状态的方法,例如: addSuppressed