Spring MVC的Controller是线程安全的么

 我来答
tc...8@163.com
2017-06-16 · 超过204用户采纳过TA的回答
知道小有建树答主
回答量:396
采纳率:0%
帮助的人:305万
展开全部
默认线程不安全。

Spring MVC默认注册bean都是单例模式,即:@Scope("singleton"),所有线程调用的都是同一个实例对象,所以线程不安全。不过可以手动指定javabean的scope为多例,即:@Scope("prototype"),每个线程调用都会重新实例化一个对象,这样就线程安全了。

1
2
3
4
5
6

@Controller
@Scope("prototype")
@RequestMapping("/user")
public class UserController {
// ...
}
电商运营的机会
2017-06-16 · 知道合伙人互联网行家
电商运营的机会
知道合伙人互联网行家
采纳数:436 获赞数:998
潭州教育网络科技有限公司最佳电商运营总监。

向TA提问 私信TA
展开全部
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 package test; import java.util.HashMap; import java.util.Hashtable; import java.util.concurrent.CountDownLatch; public class HashTbAndHashMap { public static void main(String[] args) { for (int i = 0; i < 10; i++) { //testHashMap(); testHashTable(); } } public static void testHashMap() { HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); int nbthread = 1000; CountDownLatch countDownLatch = new CountDownLatch(nbthread); for (int i = 0; i < nbthread; i++) { Thread thread = new Thread(new MyThread(map, countDownLatch)); thread.start(); } try { countDownLatch.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(map.size()); } public static void testHashTable() { Hashtable<Integer, Integer> table = new Hashtable<Integer, Integer>(); int nbthread = 1000; CountDownLatch countDownLatch = new CountDownLatch(nbthread); for (int i = 0; i < nbthread; i++) { Thread thread = new Thread(new MyThread(table, countDownLatch)); thread.start(); } try { countDownLatch.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(table.size()); } } ======================= package test; import java.util.HashMap; import java.util.Hashtable; import java.util.concurrent.CountDownLatch; public class MyThread implements Runnable { private HashMap<Integer, Integer> map; private Hashtable<Integer, Integer> table; private CountDownLatch countDownLatch; public MyThread(HashMap<Integer, Integer> map, CountDownLatch countDownLatch) { this.map = map; this.countDownLatch = countDownLatch; } public MyThread(Hashtable<Integer, Integer> table, CountDownLatch countDownLatch) { this.table = table; this.countDownLatch = countDownLatch; } @Override public void run() { for (int i = 0; i < 100; i++) { table.put(i, i); //map.put(i, i); } countDownLatch.countDown(); } } 你执行一下就看出来区别了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式