`
可执行
  • 浏览: 16983 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring默认存在线程安全问题 !!!

阅读更多
1.struts1的action是单例的,所以存在线程安全问题,但是struts2的action不是单例所以是线程安全的

2.spring默认的注入也是单例的,所以存在线程安全问题

先理解为何会有线程不安全的问题,比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。(web环境是很容易出现多用户同时访问产生多线程的)
     有一个类User,你每次使用这个类的时候都是new出来的,那么这个类一定是线程安全的吗?也不一定。
publicclass User { privatestatic String name =null; public User(String name) { User.name = name; } }
对于这个User类,即使你每次都是new一个新的,它也不是线程安全的。

避免的方法很简单
spring管理bean,设置成scope为protype,如果是web运用设置成request这样就不是单例了,而是为每个线程都创建一个;
线程安全是可以避免的,就是禁止用可变动的成员变量,如果都是局部变量的话,即使是单例的也不存在任何问题


private JdbcTemplate jdbcTemplate;
private LobHandler lobHandler;
里面没什么可变成员变量,说以他们是单例的,但是不会有线程问题

spring的生命周期范围:

singleton:SpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例
Property: 每次请求都创建一个实例
request: 在一次Http请求中,容器会返回该Bean的同一个实例,而对于不同的用户请求,会返回不同的实例。需要注意的是,该作用域仅在基于Web的Spring ApplicationContext情形下有效,以下的session和global Session也是如此
session:同上,唯一的区别是请求的作用域变为了session
global session:全局的HttpSession中,容器会返回该bean的同一个实例,典型为在是使用portletcontext的时候有效(这个概念本人也不懂)
注意:如果要用到request,session,global session时需要配置
servlet2.4及以上:
在web.xml中添加:
<listener>
<listener-class>org.springframework.web.context.scope.RequestContextListener />
</listener>
servlet2.4以下:
需要配置一个过滤器
<filter>
<filter-name>XXXX</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
<filter-mapping>
<filter-name>XXXX</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
另外,从2.0开始,可以自己定义作用域,但需要实现scope,并重写get和remove方法
特别要引起注意的是:
一般情况下前面两种作用域是够用的,但如果有这样一种情况:singleton类型的bean引用一个prototype的bean时会出现问题,因为singleton只初始化一次,但prototype每请求一次都会有一个新的对象,但prototype类型的bean是singleton类型bean的一个属性,理所当然不可能有新prototpye的bean产生,与我们的要求不符
解决方法:
1.放弃Ioc,这与设计初衷不符,并代码间会有耦合
2,Lookup方法注入,推荐
分享到:
评论

相关推荐

    spring单例引起的线程安全问题

    二、使用单例引起线程安全问题的例子 那究竟什么时候会用到呢?我相信大多数人写的代码都不会去考虑这个事情,用spring就认为只有单例,也只习惯用单例。但是有时候你想将代码写得更优雅一些的时候,你不得不去思考...

    Spring并发访问的线程安全性问题.docx

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...

    spring boot 多线程.docx

    springboot默认为单线程,多个定时任务时,必须一个执行完后才能执行另外一个,本文通过线程池达到多线程异步处理

    59-Spring Boot内嵌Tomcat配置1

    这里尤其要注意设置协议这一块,众所周知,Tomcat默认用的是BIO,在生产环境中,最差也得用NIO吧,最好是APR,那么对应的协议类如下:在实际应用的时候,可

    Spring.3.x企业应用开发实战(完整版).part2

    9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...

    springCloud

    Spring Cloud简介 Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud ...

    springcloud03.doc

    Hystrix 隔离策略 .线程池隔离-- 控制线程的并发 THREAD 线程池隔离策略 独立线程接收请求 默认的 默认采用的就是线程池隔离

    Springboot多连接池+websocket

    Springboot多连接池+websocket,相关详细技术说明可进入我的CSDN看博文哦~~如果有问题可在csdn上留言或者通过QQ694335719联系

    Spring3.x企业应用开发实战(完整版) part1

    9.2.5 Spring使用ThreadLocal解决线程安全问题 9.3 Spring对事务管理的支持 9.3.1 事务管理关键抽象 9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML...

    Spring3中配置DBCP,C3P0,Proxool,Bonecp数据源

    在Spring3中配置数据源,包括DBCP,C3P0,Proxool,Bonecp主要的数据源,里面包含这些数据源的jar文件和依赖文件及配置文件。。 如Bonecp目前听说是最快的数据源,速度是传统的c3p0的25倍, bonecp.properties文件: ...

    SpringBoot+Logback实现一个简单的链路追踪功能

    Spring Boot默认使用LogBack日志系统,并且已经引入了相关的jar包,所以我们无需任何配置便可以使用LogBack打印日志。这篇文章主要介绍了SpringBoot+Logback实现一个简单的链路追踪功能,需要的朋友可以参考下

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    涵盖使用Spring Boot 进行Java EE 开发的绝大数应用场景,包含:Web 开发、数据访问、安全控制、批处理、异步消息、系统集成、开发与部署、应用监控、分布式系统开发等。 第一部分 点睛Spring 4.x 第1 章 Spring ...

    spring boot动态多数据源demo

    自定义多数据源类MultiplyDataSource(继承HikariDataSource),通过多线程类ThreadLocal控制当前需要使用的数据源id,实现多数据源动态切换查询功能(默认数据源和其他数据源都统一使用这一个,简化了配置)。...

    Spring5的Servlet和反应式技术栈解析

    5.SpringBoot2内置了反应式Web容器,默认使用的是Netty,当然也可以选择Tomcat、Jetty或Undertow。Spring5提供了Servlet和反应式这两种Web技术栈,在应用层面充分向异步和非阻塞并发靠拢。文中我分别使用“Servlet栈...

    spring-batch-demos

    这些特性都包含在Spring Batch中,并且大部分都是默认开启的; 在您开发流程时,它们只需要对性能和要求进行最少的调整。 本地和远程并行化 批处理作业的规模以及对它们进行扩展的需求对于任何企业批处理解决方案都...

    java7hashmap源码-springcloud-one:第一个自搭建微服务

    java7 hashmap源码 ...HashMap因为非线程安全假设两个线程下同时插入数据 A线程放入key A B C B线程也同时放入 A B C 遇到容量不足的时候需要新建一个更大尺寸的HASH表,会出现 如 a-&gt;b ,b-&gt;a 形成环形

Global site tag (gtag.js) - Google Analytics