关于singleton的线程安全问题
老师好,教学影片从12:55开始,原文:
『当userService被创建,userDao是哪个类也就确定了,绝大多数情况下我们不会对userDao这个属性重新做设置,这也意味着作为userDao,他在userService中是稳定不变的』
根据老师原文的意思,当userService与userDao都在singleton的设定下,大多数情况不会出现线程安全问题,但我仍不太理解,以下是我的看法与疑问,还请老师协助解惑及纠正。
在Ioc容器启动时,设置为singleton的bean会自动被创建,但在外部调用实例时,仍然会对实例进行set与get的动作。 此时假设有两个使用者 「同时」 对server发出请求(假设是update),由于是singleton,此时service会调用同一个DAO,并且同时修改了DB中的同一条数据,那我会认为此时会有线程安全问题。
问题一:
想请这样理解是对的吗?与老师所说的不会有线程安全问题的理解上差异在哪呢?
问题二:
老师所说的dao在service中是稳定不变的,此时是指dao是写死的状态吗? 请问该怎麽理解「稳定不变」的意思呢?
正在回答
同学你好,1、当设置为单例时,并不是不会引发线程安全问题。相反的,确实会引发线程安全问题。但是这里依然使用单例的原因是,当Service和Dao的实现类对象创建完成之后,并不会再对其属性进行更改。也就是说,不会发生同学描述的多个线程对其属性进行set的情况。
但是,如果在业务中,确实需要对其属性进行更改时,就会发生线程安全问题。此时就不建议使用单例模式了,而是改为prototype,以保证每个线程操作自身独立的对象。
2、“稳定不变”是指其属性的值(无论是具体数值还是引用的对象)是不会进行更改的,也就是说内容不会改变。而“写死”是指在书写代码时,应当使用变量的位置没有使用变量,而是使用常量。例如:年龄应当使用变量,但是如果年龄位置固定写为18岁,就称之为“写死”。
祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星