原本我一直以为spring的中单例是指对当前线程来说单例,但自己测试了一下发现不是这么回事,测试过程如下
写了一个被调用的借口
@RestController
@Slf4j
public class SingletonEndpoint {
@Autowired
private SingletonService singletonService;
@RequestMapping(value = "testSingleton" ,method = RequestMethod.GET)
public String testSingleton(){
log.info("单例的测试开始,controller 的线程号为:{},SingletonService的id为:{}",Thread.currentThread().getId()
,this.hashCode());
singletonService.testSingleton();
singletonService.testSingleton();
singletonService.testSingleton();
singletonService.testSingleton();
return "success";
}
}
一个@Service
@Service
@Slf4j
public class SingletonService {
public void testSingleton(){
log.info("测试单例的service,当前的线程id为:{},服务id:{}",Thread.currentThread().getId(),this.toString());
}
}
一个测试类
@Test
public void testThreadLocal(){
for(int i =0;i<100;i++){
Thread thread = new Thread(() -> {
RestTemplate rest = new RestTemplate();
ResponseEntity<String> forEntity = rest.getForEntity("http://localhost:8080/testSingleton", String.class);
});
thread.run();
}
}
测试结果,就不全贴了,很明显,一个接口被调用,会新起一个线程来跑,调用的Controller层和Service层都不是新生成的。所以这个单例并不是线层里的单例,而是整个服务容器里的单例。
所以这家餐厅并不是进去一个人跟一个服务员,而是不管进去多少人,都是这个服务员,只是他够快。看到这如果觉得浪费了你几分钟,那就不好意思,我确实很菜,但是如果你心里也有这个疑惑,那这个可能有用,如果你发现我这个不对,还请大佬斧正,只要您说的对,喷我也没关系,谢谢!
2018-11-04 20:37:01.264 INFO 15584 --- [nio-8080-exec-1] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:96,SingletonService的id为:561740664
2018-11-04 20:37:01.264 INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.264 INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.264 INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.264 INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283 INFO 15584 --- [nio-8080-exec-2] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:97,SingletonService的id为:561740664
2018-11-04 20:37:01.283 INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283 INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283 INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283 INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291 INFO 15584 --- [nio-8080-exec-3] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:98,SingletonService的id为:561740664
2018-11-04 20:37:01.291 INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291 INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291 INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291 INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300 INFO 15584 --- [nio-8080-exec-4] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:99,SingletonService的id为:561740664
2018-11-04 20:37:01.300 INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300 INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300 INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300 INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308 INFO 15584 --- [nio-8080-exec-5] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:100,SingletonService的id为:561740664
2018-11-04 20:37:01.308 INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308 INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308 INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308 INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.317 INFO 15584 --- [nio-8080-exec-6] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:101,SingletonService的id为:561740664
2018-11-04 20:37:01.318 INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.318 INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.318 INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.318 INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329 INFO 15584 --- [nio-8080-exec-7] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:102,SingletonService的id为:561740664
2018-11-04 20:37:01.329 INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329 INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329 INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329 INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335 INFO 15584 --- [nio-8080-exec-8] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:103,SingletonService的id为:561740664
2018-11-04 20:37:01.335 INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335 INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335 INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335 INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340 INFO 15584 --- [nio-8080-exec-9] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:104,SingletonService的id为:561740664
2018-11-04 20:37:01.340 INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340 INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340 INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340 INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.345 INFO 15584 --- [io-8080-exec-10] c.p.t.endpoint.SingletonEndpoint : 单例的测试开始,controller 的线程号为:105,SingletonService的id为:561740664