SpringMVC线程安全问题

SpringMVC默认是单例

1、成员变量会存在非线程安全问题:

测试如下:

定义成员变量:

    private String param = "a";

定义方法:

        @RequestMapping("/alarm/testA.do")
	public void testA(String param) throws InterruptedException{
		this.param = param;
		Thread.sleep(10000l);
		System.out.println(this.param);
	}
	@RequestMapping("/alarm/testB.do")
	public void testB(String param){
		System.out.println(this.param);
	}

测试:

   a、 浏览器输入:http://localhost:8082/alarm/testA.do?param=ItsTestA

    调用方法“testA”,将成员变量赋值为“ItsTestA",然后将其休眠10s。10s之后打印结果为"ItsTestA"。

    b、紧接着调用方法"testB",http://localhost:8082/alarm/testB.do?param=ItsTestB

    直接打印成员变量,输出结果为被方法"testA"修改过的值"ItsTestA"。

2、局部变量存在非线程安全问题:

定义方法:

    @RequestMapping("/alarm/test1.do")
    public void test1(String param) throws InterruptedException{
        test(param);
    }
    
    public void test(String param) throws InterruptedException{
        System.out.println("-----------------------");
        if("x".equals(param)){
            Thread.sleep(10000l);
            System.out.println(param);
        }
        else
            System.out.println(param);
    }

测试:

    a、 浏览器输入:http://localhost:8082/alarm/test1.do?param=x

    调用方法"test1",传递参数值为“x",将线程休眠10s,10s之后打印参数值为:”x"。

    b、浏览器输入:http://localhost:8082/alarm/test1.do

    再次调用方法"test1",不传递参数,输出结果为:null,不受第一次调用传参影响。

你可能感兴趣的:(Java,Spring,SpringMVC)