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

帮我解决我的简单问题。


这是我的简单例外。


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 中 'error' 字段的值可能会发生变化。


“MyException(extends RuntimeException)”的字段值是“线程安全”吗?


我不认为这会是安全的。谢谢你的教导。


qq_笑_17
浏览 308回答 2
2回答

紫衣仙女

正如评论者所提到的,您可以通过使用final关键字使您的异常成为线程安全的,假设它MyErrors也是线程安全的。但是,您应该注意,您担心的是如果在多线程环境中使用 MyService 并且发生许多 MyException,则 MyException 中“错误”字段的值可能会更改。在这里无效。您的异常不需要是线程安全的,因为即使抛出异常,它也只会对抛出线程可用。由于MyException似乎是运行时异常,因此您似乎没有传播异常,因此一旦抛出异常,您似乎不会在任何地方共享异常的状态。如果是这种情况,我建议您保持异常非线程安全。

富国沪深

RuntimeException扩展自Throwable,它不是线程安全的或不可变的。它具有更改状态的方法,例如:&nbsp;addSuppressed
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java