Servlet的线程安全问题

来源:互联网 发布:漫威宇宙实力排行知乎 编辑:程序博客网 时间:2024/04/30 17:13

Servlet线程安全问题

1.什么时候会出现线程安全问题?

1)局部变量

  • 存于栈中
  • 每个线程都有自己的栈帧

每个线程访问自己的数据,没有冲突

2)成员变量

  • 存于堆中
  • 堆中的数据被多个线程共用的

多个线程同时修改这样的数据,有冲突

2.如何解决线程安全问题?

  • 加锁

3.案例


案例代码如下:

package web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UpServlet extends HttpServlet {private static final long serialVersionUID = 1L;//成员变量double salary = 2000;@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//加锁synchronized(this){salary += 100;//模拟网络try {Thread.sleep(6000);} catch (InterruptedException e) {e.printStackTrace();}//显示数据,输出给浏览器res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();out.println(salary);out.close();}}}
总结:用不同的浏览器访问后得到的结果不同,如不加锁,则可能造成相同的结果

0 1
原创粉丝点击