17.线程实例分析

servlet是单例的,tomcat中会有多个线程去共享servlet。

HashMap是线程不安全的

String是不可变的类,是线程安全的

final String 是线程安全的

Date是线程不安全的

final Date D2 是线程不安全的

说明:添加final关键字不影响变量的线程安全,只是说该变量不能再修改。如果是引用对象,引用不能再修改,但是对象里面的属性还是可以被修改的。所以,final String s2是线程安全的;final Date D2是线程不安全的。

servlet只有一份,那么UserService对象实例也只有一份,所以tomcat中的多个线程会共享这一个实例,会存在线程安全问题。另外count又是成员变量共享资源。

spring中默认的bean对象都是单例的,这里start又是成员变量,多个线程共享start变量,方法中对成员变量进行赋值和修改。所以会有线程安全问题。

解决办法:采用环绕通知,而非前置通知和后置通知,将成员变量做成局部变量,避免线程安全问题。

说明:

dao类里面没有成员变量,只有局部变量,比如connection对象,每个线程都有属于自己的connection对象,所以是线程安全的。

service类里面有成员变量,就是dao,但是dao是private的并且给了固定的值==相当于没有被改变。所以也是线程安全的。

说明:connection对象做成了成员变量,这就有线程安全问题了。因为多个线程共享connection对象,如果第一个线程创建了connection对象还没有使用,第二个线程就执行了conn.close方法将connection对象关闭了。所以应该将connection对象做成线程内私有的局部变量。

说明:这种写法,connection对象作为成员变量就不会有线程安全问题,因为userDao对象变成了局部变量了。但是在开发中不推荐这种写法。

说明:SimpleDateFormat对象虽然是局部变量,但是foo方法是不确定的,如果foo方法被子类复写会开启一个新的线程,那就是线程不安全的。SimpleDateFormat本身不是线程安全的

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷土重来…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值