幫我解決我的簡(jiǎn)單問(wèn)題。這是我的簡(jiǎn)單例外。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 是一個(gè) Spring bean 和單例。我認(rèn)為如果在多線程環(huán)境中使用 MyService 并且發(fā)生許多 MyException,則 MyException 中 'error' 字段的值可能會(huì)發(fā)生變化?!癕yException(extends RuntimeException)”的字段值是“線程安全”嗎?我不認(rèn)為這會(huì)是安全的。謝謝你的教導(dǎo)。
2 回答

紫衣仙女
TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
正如評(píng)論者所提到的,您可以通過(guò)使用final
關(guān)鍵字使您的異常成為線程安全的,假設(shè)它MyErrors
也是線程安全的。
但是,您應(yīng)該注意,您擔(dān)心的是
如果在多線程環(huán)境中使用 MyService 并且發(fā)生許多 MyException,則 MyException 中“錯(cuò)誤”字段的值可能會(huì)更改。
在這里無(wú)效。您的異常不需要是線程安全的,因?yàn)榧词箳伋霎惓?,它也只?huì)對(duì)拋出線程可用。由于MyException
似乎是運(yùn)行時(shí)異常,因此您似乎沒(méi)有傳播異常,因此一旦拋出異常,您似乎不會(huì)在任何地方共享異常的狀態(tài)。
如果是這種情況,我建議您保持異常非線程安全。

富國(guó)滬深
TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
RuntimeException擴(kuò)展自Throwable,它不是線程安全的或不可變的。它具有更改狀態(tài)的方法,例如: addSuppressed
添加回答
舉報(bào)
0/150
提交
取消