prototype线程安全问题

prototype线程安全问题

http://img1.sycdn.imooc.com//climg/5f3e352809e4e66c12470665.jpg


prototype 不存在线程安全问题???   我觉得这根本没有任何直接的联系

所谓有无线程安全问题,是指  【一段代码是否同时操作同一个 属性变量】 

1.如上图所示,userDAO类中的代码  假设它是使用 singleton且有属性变量, 意味着它的属性变量是唯一的, 此时如果它 操作自己的属性变量 是会造成 线程安全,但 prototype不会,因为它有多个实例,它的属性变量不唯一。

2. 但现在假设  userDAO类中的代码  假设它是使用 prototype且有属性变量,因为它有多个实例,它的属性变量不唯一,  由此就能推出线程安全?? 根本不是!!  因为  userDAO类中的函数  操作自己的属性当然没问题,,但 我类中的函数 操作其它 类的唯一属性变量,不是依旧会出现 线程安全问题??

总结 是否出现线程安全问题,根本不是 使不使用 prototype或者singleton 的关系,可以说两者没有任何直接的联系,,  归根到底是   【某一函数有没 操作同一变量】 如果有,即使使用prototype一样会出现线程安全,例子如上述2     

我的理解对吗?

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,

老师理解了一下,同学的意思是不是就是,这种情况?

http://img1.sycdn.imooc.com//climg/5f3f458509c961a506660430.jpg

如果是,那么其实线程安全问题其实是这个全局唯一变量的问题,那么解决这个线程安全问题,我们可能就会采取对这个变量加锁,或者消息队列等方式,也就是扣到同学最初的主题上了。同学最初的这个总结上,理解是对的。

而老师课程中所说的,多例是线程安全的,其实是说,这个bean中,如果有属性,有存储数据时(非静态变量),线程是安全的。

这里说法确实不是非常的严谨,这个我们也会反馈给老师。

只是希望同学能理解这个意思。祝学习愉快。

好帮手慕阿满 2020-08-21 11:31:16

同学你好,同学举的例子不太合适。

http://img1.sycdn.imooc.com//climg/5f3f35dc0953c46206230064.jpg

多例的Dao对象单线程操作一个其他类的唯一属性,这里的线程安全问题是由其他类的唯一属性造成的,并不是多例造成的。例如,多个Dao操作数据库中某一行,数据库中会给该行数据加锁,避免造成线程安全问题。这里的线程安全问题并不是Dao造成的,实际的工作中,如果有线程安全问题,会对其进行处理的,例如数据库中对某行数据加锁;使用消息队列等。

http://img1.sycdn.imooc.com//climg/5f3f3db0096f65ae06380245.jpg

Service调用Dao出现线程安全问题是由单线程的Dao造成的,线程安全问题需要由Dao处理。

如果将单线程的Dao变成多线程,多个Service操作多个Dao,一个Service对应一个Dao,Service单线程执行Dao中的方法,不存在并发的问题。

祝:学习愉快~

好帮手慕小班 2020-08-20 19:12:47

同学你好,1、同学对于线程安全的理解是正确的,线程安全其实就是指当多个线程访问同一个变量时,该变量不会因为多线程访问产生意想不到的问题。

    2、同学的举例,在实际应用中,我们不会这样去使用。

        因为作为prototype是为每一个线程创建它的一个对象实例,那么在这个对象实例执行的时候,无论执行这个实例中的多少个方法,因为它是单线程执行,所以它是按时序来进行的,不存在并发的问题,也就是说它并不会出现在一个线程中,同时执行A和同时执行B的情况。除非是在这个对象中自己又书写了一个多线程的处理,它才会出现这种可能。

    课程中老师是站在实际开发中的角度去讲解的这个线程的问题,所以说prototype是线程安全的,同学的建议小慕也会反馈给老师的。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 py_builder #1
    1.假设这个被标记为 prototype的DAO类对象 里面有一个方法是 单线程操作 一个 其它类的唯一属性property 2. 用户输入URL 触发 servlet 去调用 Service,从而Service调用DAO,,因为DAO是单线程的,好像不会有线程安全。 但再深入想想,,这一个过程真的是一直单线程吗?? 现在有100个用户同时输入URL触发servlet,即100个用户调用 DAO【DAO在操作唯一的属性】,,这个时候是单线程的吗??明显不是,,这100个用户怎么可能逐个等待,这肯定是多线程并发的情况啊。。 3.问题出在哪里?? 由DAO层反推,,DAO对象是单线程的,但很明显是sevlet或者服务器层是多线程的,即多线程调用单线程函数,,那单线程函数其实不就等于变成了多线程?? 因此 引用您的话 【因为作为prototype是为每一个线程创建它的一个对象实例,那么在这个对象实例执行的时候,无论执行这个实例中的多少个方法,因为它是单线程执行,所以它是按时序来进行的,不存在并发的问题】 这句话应该还没考虑周全吧??
    2020-08-20 21:06:53
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师