【发布时间】:2015-07-22 03:44:06
【问题描述】:
我是 Spring MVC 的新手,我在 doc 中没有找到任何关于此的内容。
假设我有一个控制器 /accounts 接受 POST 请求来创建一个帐户。
两个请求(几乎)同时使用相同的帐户 ID。
ASFAIK dispatcherServlet 管理请求。
在第一个请求完成之前,第二个请求是否被放入队列? 或者会有两个线程同时处理两个请求?
更新:
查看官方 Spring 教程:Building a REST service。
有方法add的控制器:
@RequestMapping(method = RequestMethod.POST)
ResponseEntity<?> add(@PathVariable String userId, @RequestBody Bookmark input) {
this.validateUser(userId);
return this.accountRepository
.findByUsername(userId)
.map(account -> {
Bookmark result = bookmarkRepository.save(new Bookmark(account,
input.uri, input.description));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(ServletUriComponentsBuilder
.fromCurrentRequest().path("/{id}")
.buildAndExpand(result.getId()).toUri());
return new ResponseEntity<>(null, httpHeaders, HttpStatus.CREATED);
}).get();
}
控制器只是 bean,默认情况下它们是单例的。 当接收到两个同时请求时,两个线程使用相同的控制器实例。让我们假设第一个线程已经保存了新书签并正在执行
httpHeaders.setLocation(ServletUriComponentsBuilder
.fromCurrentRequest().path("/{id}")
.buildAndExpand(result.getId()).toUri());
同时第二个线程刚刚执行
Bookmark result = bookmarkRepository.save(new Bookmark(account,
input.uri, input.description));
在这种情况下,第一个线程将返回由第二个线程创建的result.getId()).toUri()。
这是正确的工作流程吗?这个控制器线程安全吗?
【问题讨论】:
-
如果控制器有状态,就会出现线程问题。但它没有。你在这里操作的只是局部变量,每个线程都有自己的、非共享的局部变量。一个线程无法看到另一个线程的局部变量。
标签: java multithreading spring-mvc spring-boot