线程安全

一.作用域为servletContext的属性不是线程安全的,因为作用域为context的数据可供整个app访问,不同的线程,不同的selverlet可以同时访问同一个数据。

解决线程安全的方法是:锁住servletContext对象

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

response.setContentType(“text/html”);

PrintWriter out = response.getWriter();

out.println(“test context attributes<br>”);

synchronized(getServletContext()) {

getServletContext().setAttribute(“foo”, “22”);

getServletContext().setAttribute(“bar”, “42”);

out.println(getServletContext().getAttribute(“foo”));

out.println(getServletContext().getAttribute(“bar”));

}

}

二.作用域为session的属性是非线程安全的,虽然一个会话只能有一个session,但是一个客户同时打开2个浏览器窗口时,session不是线程安全的。

解决线程安全的方法是:锁住session对象

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

response.setContentType(“text/html”);

PrintWriter out = response.getWriter();

out.println(“test session attributes<br>”);

HttpSession session = request.getSession();

synchronized(session) {

session.setAttribute(“foo”, “22”);

session.setAttribute(“bar”, “42”);

out.println(session.getAttribute(“foo”));

out.println(session.getAttribute(“bar”));

}

}

 

三.servlet类的实例变量是非线程安全的

因为一个servlet可能有多个线程同时访问实例变量

可以为该servlet实现单线程接口,这样可以线程安全,但是实际开发没人这样做,因为这样做影响并发性。

那么,一般是在servlet类中尽量不写实例变量,即在jsp中不写<%! %>

 

四.只有请求属性(request作用域属性)和局部变量是线程安全的。

 

转载于:https://my.oschina.net/Cubicluo/blog/807784

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值