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

时间:2018-08-22 02:37:25

标签: java

帮我一个简单的问题。

这是我的简单例外。

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)”的字段值是否是“线程安全的”?

我认为这不会安全。 谢谢您的指导。

2 个答案:

答案 0 :(得分:0)

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

但是,您应该注意您的关注

  

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

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

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

答案 1 :(得分:0)

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