zoukankan      html  css  js  c++  java
  • jmm 和线程安全

    Java的内存模型JMM

    Java的内存模型JMM(Java Memory Model)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。根据JMM,我们可以将论文中所讨论的Servlet实例的内存模型抽象为下图所示的模型。


    Servlet的线程安全问题

    Servlet的线程安全问题主要是由于实例变量使用不当而引起的,这里以一个现实的例子来说明。

    /**
     * 模拟用户AB在同时执行不同的动作
     * 先执行 http://localhost:8080/concurrent?username=A&action=play
     * 稍后执行 http://localhost:8080/concurrent?username=B&action=eat
     */
    public class Concurrent extends HttpServlet {
        private static final long serialVersionUID = 1L;
        private String action = "";//动作  
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            try {  
                String username = request.getParameter("username");  
                action = request.getParameter("username");  
                Thread.sleep(5000); //为了突出并发问题,在这设置一个延时  
                //如果不出意外,应该用户AB都在吃饭
                System.out.println("用户:"+username+"在"+action);
            } catch (Exception e) {  
            }  
        }
    }

    Struts1

    首先,明确一点Sturts1 action是单例模式,线程是不安全的。Struts1使用的ActionServlet是单例的,既然是单例,当使用实例变量的时候就会有线程安全的问题。所有一般在开发中试禁止使用实例变量的。

    Struts2

    struts2使用的是actionContext,都是使用里面的实例变量,让struts2自动匹配成对象的。每次处理一个请求,struts2就会实例化一个对象,这样就不会有线程安全的问题了。

    需要注意的是,如果struts2+spring来管理注入的时候,不要把Action设置成单例,否则会出问题的。当然现在很少有项目使用struts2了。

    SpringMVC

    SpringMVC的controller默认是单例模式的,所以也会有多线程并发的问题。

    总结

    • servlet Struts1 SpringMvc 是线程不安全的,当然如果你不使用实例变量也就不存在线程安全的问题了。

    • Struts2 是线程安全的,当然前提情况是,Action 不交给 spring管理,并且不设置为单例。

    • SpringMvc 的 Bean 可以设置成多例变成线程安全,但是一定程度上回影响系统性能。

  • 相关阅读:
    CodeForces
    CodeForces
    CodeForces
    【模板】POJ-1511(dijkstra堆优化+链式前向星)
    【模板】POJ-1502(dijkstra)
    P2862 [USACO06JAN]Corral the Cows G
    P2495 [SDOI2011]消耗战
    CF613D Kingdom and its Cities
    P4655 [CEOI2017]Building Bridges
    P3917 异或序列
  • 原文地址:https://www.cnblogs.com/yelongsan/p/8857660.html
Copyright © 2011-2022 走看看