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

spring scope与线程之间的关系?

spring scope与线程之间的关系?

互换的青春 2019-05-22 20:38:20
springscope与线程之间的关系怎么解释?有没有什么关联性?问题如下:springscope模拟为单例模式,则认为多次请求同一个地址时,是按顺序执行,如同时执行5次a的test方法,会按顺序执行如下代码:@GetMapping("test1")publicObjecttest1(HttpServletRequestrequest)throwsInterruptedException{logger.error("this:{},intime:{}",this.toString(),System.currentTimeMillis());StringsleepFlag=request.getParameter("sleep");if("on".equalsIgnoreCase(sleepFlag)){Thread.currentThread().sleep(10000l);logger.error("returntime:{}",System.currentTimeMillis());return"sleep10s";}logger.error("returntime:{}",System.currentTimeMillis());return"nosleep";}1.http://localhost:8080/test1?sleep=on2.http://localhost:8080/test1各执行两次,执行顺序为1-1、1-2、2-1、2-2,打印结果如下:2018-03-2616:56:03.793ERROR16292---[nio-8080-exec-1]c.e.m.web.controller.UserController:this:com.example.multimodule.web.controller.UserController@7f74f276,intime:15220545637932018-03-2616:56:07.349ERROR16292---[nio-8080-exec-2]c.e.m.web.controller.UserController:this:com.example.multimodule.web.controller.UserController@7f74f276,intime:15220545673492018-03-2616:56:07.349ERROR16292---[nio-8080-exec-2]c.e.m.web.controller.UserController:returntime:15220545673492018-03-2616:56:09.438ERROR16292---[nio-8080-exec-4]c.e.m.web.controller.UserController:this:com.example.multimodule.web.controller.UserController@7f74f276,intime:15220545694372018-03-2616:56:09.438ERROR16292---[nio-8080-exec-4]c.e.m.web.controller.UserController:returntime:15220545694382018-03-2616:56:13.797ERROR16292---[nio-8080-exec-1]c.e.m.web.controller.UserController:returntime:15220545737972018-03-2616:56:13.801ERROR16292---[nio-8080-exec-8]c.e.m.web.controller.UserController:this:com.example.multimodule.web.controller.UserController@7f74f276,intime:15220545738012018-03-2616:56:23.801ERROR16292---[nio-8080-exec-8]c.e.m.web.controller.UserController:returntime:1522054583801结果:执行过程中1-1与1-2符合预期结果,即第一次执行完成以后休眠10s执行第二次,但1-1与2-1中间并没有休眠过程(有时间差是因为手工执行的),并且不管controller是否设置为scope=prototype,执行结果都是一样的求解释
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

我个人认为是你把单例和线程安全搞混了,单例并不意味着线程安全,多线程同时访问单例同样存在并发问题,除非你手动加锁。下面通过一个例子说明,你觉得最后count会是多少?
publicclassDemo{
privateintcount;
publicvoidadd(){
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
this.count++;
}
publicstaticvoidmain(String[]args){
Demod=newDemo();
//8个线程同时访问同一个demo
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
newThread(()->{d.add();}).start();
//主线程休眠2s,等其他线程执行结束
try{
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println(d.count);
}
}
                            
查看完整回答
反对 回复 2019-05-22
  • 2 回答
  • 0 关注
  • 414 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信