关于springmvc中的controller有无并发阻塞问题

本文探讨了Spring MVC中Controller是否会出现并发阻塞问题。通过测试发现,尽管Controller是单例模式,但并发请求不会导致阻塞,因为每个请求在不同的线程中执行。不过,如果在Controller中创建全局变量,就需要考虑并发控制,以避免数据混乱问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于controller的一点疑问

一般情况下,spring中的controller是单例模式的,也就是说所有的访问都会调用同一个controller的方法,自然而然的就会想到并发的问题,当某一个请求调用controller方法尚未退出时,是否会造成后续请求的阻塞。
写个小demo测试一下

	@RequestMapping("/dotest01/{id}")
	@ResponseBody
	public String dotest01(@PathVariable("id") int id) {
		long start =System.currentTimeMillis();
		String str;
		if(id==1) {
			try {
				Thread.sleep(4000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			log.info("1号"+Thread.currentThread().getName());
			log.info(this.toString());
			str="1号结果!";
		}else {
			log.info("2号"+Thread.currentThread().getName());
			log.info(this.toString());
			str="2号结果";
		}
		long time =System.currentTimeMillis()-start;
		return str+time;
	}

进行测试先发送访问dotest01/1,后访问dotest01/2,很明显第一个页面尚在加载,第二个就已经返回
在这里插入图片描述在这里插入图片描述
再看看后头的对象
在这里插入图片描述
很明显,线程是单独的但是controller是同一个。
可以确认的是,不用考虑controller的阻塞问题,再写一个多线程测试案例


public class TestThread {
	public static void main(String[] args) {
		MyTool tool = new MyTool();
		new Thread(new MyThread(0, tool)).start();
		new Thread(new MyThread(1, tool)).start();
	}
}

class MyThread implements Runnable {
	
	private int id;
	
	private MyTool tool;
	
	public MyThread(int id,MyTool tool) {
		this.id=id;
		this.tool=tool;
	}
	
	public void run() {
		long start = System.currentTimeMillis();
		System.out.println("Thred:"+Thread.currentThread().getName()+"=="+tool.toString());
		tool.dosome(id);
		long time = System.currentTimeMillis()-start;
		System.out.println("id"+id+"==time="+time);
	}
}

 class MyTool {
	public void dosome(int id) {
		if(id ==0) {
		System.out.println("00开始工作!");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("00工作完成!");
		}else {
			System.out.println("01开始工作!");
			System.out.println("01工作完成!");
		}		
	}
}

测试结果为在这里插入图片描述
符合期望,工作线程不同,工作对象同一个。在修改一下

public synchronized void dosome(int id){
		.....
}

为方法加上锁,这时候就不同了,在这里插入图片描述
此时线程才会阻塞,说到底对阻塞的概念有点混乱,多线程是可以同时访问通一个不加锁方法,所谓额并发问题是多线程操作造成的数据混乱,阻塞是加锁造成的,很显然controller并未给方法加锁,所以并不会有阻塞的问题。
但是也得注意,在controller中创建全局变量这时候就要考虑并发问题了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值