`
可执行
  • 浏览: 17444 次
  • 性别: 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方法注入,推荐
分享到:
评论

相关推荐

    struts1,struts2,webwork,线程安全问题

    在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时访问一个`Action`实例时,可能会因为共享状态而导致数据不一致或其他并发问题。 - **Struts1中...

    基于Spring+Ibatis的安全线程实现

    2. **单例Bean的线程安全**:Spring默认的Bean作用域为单例,如果Bean不是无状态的,即其内部包含共享状态,那么需要谨慎处理线程安全问题。通常,我们可以通过将有状态Bean改为原型作用域,或者使用AOP在方法级别...

    Java 单例模式线程安全问题

    但是,这些方式都存在线程安全问题,例如在多线程环境下,多个线程可能会同时访问同一个实例,从而导致数据不一致和其他问题。 ThreadLocal 类可以解决单例模式的线程安全问题。ThreadLocal 提供了一个独立的变量...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    在本文中,我们主要探讨了在使用Spring Session以及Redis作为存储方式时,由于消息监听导致创建大量线程的问题及其解决方案。我们将从Spring Session的基础知识、Redis在Spring Session中的作用、监听机制导致线程...

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

    【Spring 单例模式与线程安全问题】 在 Spring 框架中,单例(Singleton)模式是一种常见的bean管理方式,意味着在整个Spring容器中,只有一个特定类的实例被创建并共享。默认情况下,所有 Spring 的bean 都是单例...

    spring boot 多线程.docx

    在Spring Boot项目中,默认情况下,程序采用的是单线程模式运行。这意味着如果存在多个定时任务(例如使用`@Scheduled`注解定义的任务),那么这些任务将会依次执行,即一个任务必须完全执行完毕后,下一个任务才能...

    spring线程发送邮件

    本文将深入探讨"spring线程发送邮件"这一主题,结合标签"源码"和"工具",我们将从源码层面理解Spring如何实现线程异步发送邮件,并探讨相关工具的使用。 在Spring框架中,邮件服务的实现主要依赖于`javaMailSender`...

    Spring-Boot中如何使用多线程处理任务方法

    "Spring Boot 中多线程处理任务方法详解" 在 Spring Boot 项目中,使用多线程处理任务是一种常见的...但是,我们需要注意在使用多线程处理任务时的一些问题,例如线程安全、资源竞争等问题,以免出现一些意外情况。

    详解Spring-Boot中如何使用多线程处理任务

    需要注意的是,在 Spring Boot 项目中,多线程处理任务需要注意线程安全问题,例如使用线程安全的集合、锁机制等,以避免出现线程安全问题。 此外,在使用多线程处理任务时,需要注意线程池的使用,避免创建过多的...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    默认情况下,每个请求都在单独的线程中执行,这意味着可以并行处理多个请求,提高系统响应速度。 2. 然而,过多的并发请求可能导致服务器资源紧张,这时可以通过引入线程池来控制并发数量,防止资源耗尽。 二、...

    59-Spring Boot内嵌Tomcat配置1

    内嵌的 Tomcat 容器是 Spring Boot 默认的 Web 服务器,使得我们可以无需额外配置即可运行 Java Web 应用。在本篇文章中,我们将探讨如何对 Spring Boot 内嵌的 Tomcat 进行个性化配置。 首先,Spring Boot 提供了 ...

    Struts中action线程安全问题解析

    默认情况下,Struts1会使用一个Action实例来处理多个请求,这就可能导致线程安全问题。如果Action中包含任何可变的成员变量,这些变量可能会在并发请求之间发生冲突,造成数据不一致。例如,如果一个Action中有如下...

    Spring Security(Spring安全权限管理手册) PDF

    ### Spring Security 安全权限管理手册知识点概览 #### 序言:为何选择Spring Security? - **背景介绍**:Spring Security起源于一个名为Acegi的项目,并在2.0版本时正式成为Spring框架的一部分。其前身Acegi在...

    Spring HttpInvoke实现,以及效率提升!

    1. **数据序列化与反序列化**:默认情况下,Spring HttpInvoke 使用 Java 对象序列化进行数据交换,这可能会成为性能瓶颈。为了提升效率,可以考虑使用更高效的序列化框架,如 Protobuf 或 JSON 格式(如 Jackson 或...

    Spring bean为什么默认是单例

    相比之下,"prototype"作用域的Bean每次请求都会创建新的实例,避免了线程安全问题,但代价是性能的降低,因为每个请求都需要创建一个新的Bean。 总结起来,Spring将Bean默认设置为单例是为了优化性能和资源利用,...

    netty4与spring集成

    5. **线程模型**: Netty 使用 NIO 或 EPOLL 等非阻塞 I/O 模型,而 Spring 默认使用线程池。集成时需注意线程模型的兼容性,确保 Netty 的工作线程和 Spring 的任务调度器协同工作,避免资源冲突。 6. **Spring MVC...

    基于spring的Acegi安全框架认证与授权的分析及扩展.pdf

    Acegi的设计理念旨在解决传统Java认证和授权服务(JAAS)中存在的不足,如政策文件难以管理和用户权限无法根据对象状态动态调整等问题。 #### 2. Acegi安全框架的核心组件分析 Acegi的安全框架由多个核心组件构成...

    Spring中自定义session管理,SpringSession的使用

    2. 分布式锁:在多线程环境中,可以利用SpringSession的锁机制避免并发问题,如使用`SessionLock`。 3. 监听Session事件:通过实现`SessionInformationExpiredEvent`和`SessionDestroyedEvent`监听器,可以捕获...

Global site tag (gtag.js) - Google Analytics