博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jmm 和线程安全
阅读量:4311 次
发布时间:2019-06-06

本文共 1567 字,大约阅读时间需要 5 分钟。

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 可以设置成多例变成线程安全,但是一定程度上回影响系统性能。

转载于:https://www.cnblogs.com/yelongsan/p/8857660.html

你可能感兴趣的文章
(C#)调用Webservice,提示远程服务器返回错误(500)内部服务器错误
查看>>
flex布局
查看>>
python-----python的文件操作
查看>>
java Graphics2d消除锯齿,使字体平滑显示
查看>>
java 初级复习。
查看>>
工厂模式学习
查看>>
蓝牙2
查看>>
css的盒模型,及css3的box-sizing新属性
查看>>
图解机器学习读书笔记-CH1
查看>>
控件中添加的成员变量value和control的区别
查看>>
Spring Boot Docker 实战
查看>>
Div Vertical Menu ver3
查看>>
Git简明操作
查看>>
InnoDB为什么要使用auto_Increment
查看>>
课堂练习之买书打折最便宜
查看>>
定义函数
查看>>
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
查看>>
MQTT协议笔记之mqtt.io项目HTTP协议支持
查看>>
(转)jQuery中append(),prepend()与after(),before()的区别
查看>>
Tecplot: Legend和图像中 Dashed/Dash dot/Long dash 等虚线显示没有区别的问题
查看>>