为了账号安全,请及时绑定邮箱和手机立即绑定

由于枚举的值是单例的,在BussinessException中直接传入枚举实例并修改,可能会有并发问题吧?

由于枚举的值是单例的,如果在一个BussinessException传入枚举,再执行setErrMsg修改错误信息。那么在不同线程里所有引用这个枚举的BussinessException中的ErrMsg都会改变。

正在回答

8 回答

@RestController
@RequestMapping("/user")
public class UserController {
    
    @GetMapping("/get")
    public String get() {
        return EmBusinessError.PARAMETER_VALIDATION_ERROR.setErrMsg("用户id错误")
                    .getErrMsg();
    }

    @GetMapping("/getDefaultMsg")
    public String getDefaultMsg() {
        return EmBusinessError.PARAMETER_VALIDATION_ERROR.getErrMsg();
    }
}

setErrMsg这个方法是有问题的。

假设第一次调用方法get,返回”用户id错误“消息,第二次调用getDefaultMsg方法期望返回“参数错误”这条消息,由于枚举类是单例的,所以在get修改EmBusinessError.PARAMETER_VALIDATION_ERROR的属性后,getDefaultMsg方法还是返回”用户id错误“消息。

1 回复 有任何疑惑可以回复我~

有的吧 通过枚举创建的通用错误类型是单列的啊  并发下都调用setErrmsg就有并发问题 没毛病的


0 回复 有任何疑惑可以回复我~

这里改的是局部变量吧,没有并发问题


0 回复 有任何疑惑可以回复我~

反编译枚举类就知道,枚举类的成员变量都是用static final来修饰的,这样修改绝对存在线程安全问题,建议msg不要在这里修改

1 回复 有任何疑惑可以回复我~
#1

少年啊c

这个改的是局部变量
2019-08-01 回复 有任何疑惑可以回复我~

你怎么修改枚举中的属性?反射?你要用反射那有什么会是安全的?

0 回复 有任何疑惑可以回复我~
#1

webcat 提问者

枚举可以有自定义属性。修改自定义属性和普通的类一样的。比如本节视频教程中定义的枚举EmBussinesError
2019-03-28 回复 有任何疑惑可以回复我~

抱歉,我说错了。枚举不是单例,枚举里面可以定义多个值,每个值都是一个实例,但是这些枚举值是单例的。用枚举实现单例模式也是利用它的值只实例化一次这个特性。

在这个视频教程中,创建了一个枚举,枚举定义了多个值,又定义了两个枚举属性code,errMsg。

教程中,在使用某个枚举值的时候,修改了枚举的属性errMsg。这样是不是有线程安全问题?

0 回复 有任何疑惑可以回复我~
#1

sunbohan00

我这是才想起来有个问题忘了和你说,你发的这些东西是回复你自己,回复的不是我,如果不是我突然想起一个问题,我永远都不会看到你的这段话。 第二点:课程是5-2里面有的,你为什么提问在3-3。 第三点:我刚看到5-2里面,调用BussinessException的ErrMsg,根本不会存在你说的问题,首先多个code提示词,是在不同判断下条件下的,其次,每一个订单都会重新调用这个方法,不会遗留code重复的问题。
2019-03-28 回复 有任何疑惑可以回复我~
#2

webcat 提问者 回复 sunbohan00

谢谢你的回复。每个订单都会重新调用这个方法,这个没问题,问题在于并发。如果分别有两个用户同时去修改同一个code对应的errMsg,即他们同时去修改同一个枚举值的errMsg,这样就会出现后者把前者的errMsg覆盖。
2019-03-28 回复 有任何疑惑可以回复我~

枚举是实现单例模式的一种方式,但不代表枚举就是单例模式。由于枚举和单例很像,都是将构造方法私有化,且不用考虑序列化的问题。

多线程并发问题,把Singleton声明成volatile,

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

由于枚举的值是单例的,在BussinessException中直接传入枚举实例并修改,可能会有并发问题吧?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信