SpringMVC是单例的,高并发情况下,如何保证性能的?
2017-08-01 01:08
393 查看
转自http://blog.csdn.net/config441002/article/details/52084156
首先在大家的思考中,肯定有影响的,你想想,单例顾名思义:一个个排队过... 高访问量的时候,你能想象服务器的压力了... 而且用户体验也不怎么好,等待太久~
实质上这种理解是错误的,Java里有个API叫做ThreadLocal,spring单例模式下用它来切换不同线程之间的参数。用ThreadLocal是为了保证线程安全,实际上ThreadLoacal的key就是当前线程的Thread实例。单例模式下,spring把每个线程可能存在线程安全问题的参数值放进了ThreadLocal。这样虽然是一个实例在操作,但是不同线程下的数据互相之间都是隔离的,因为运行时创建和销毁的bean大大减少了,所以大多数场景下这种方式对内存资源的消耗较少,而且并发越高优势越明显。
总的来说就是,单利模式因为大大节省了实例的创建和销毁,有利于提高性能,而ThreadLocal用来保证线程安全性。
另外补充说一句,单例模式是spring推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。spring IOC的bean管理器是“绝对的线程安全”。
web项目本身支持多进程
每个请求都是单独的线程,即时同时访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,不需要做同步处理。
首先在大家的思考中,肯定有影响的,你想想,单例顾名思义:一个个排队过... 高访问量的时候,你能想象服务器的压力了... 而且用户体验也不怎么好,等待太久~
实质上这种理解是错误的,Java里有个API叫做ThreadLocal,spring单例模式下用它来切换不同线程之间的参数。用ThreadLocal是为了保证线程安全,实际上ThreadLoacal的key就是当前线程的Thread实例。单例模式下,spring把每个线程可能存在线程安全问题的参数值放进了ThreadLocal。这样虽然是一个实例在操作,但是不同线程下的数据互相之间都是隔离的,因为运行时创建和销毁的bean大大减少了,所以大多数场景下这种方式对内存资源的消耗较少,而且并发越高优势越明显。
总的来说就是,单利模式因为大大节省了实例的创建和销毁,有利于提高性能,而ThreadLocal用来保证线程安全性。
另外补充说一句,单例模式是spring推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。spring IOC的bean管理器是“绝对的线程安全”。
web项目本身支持多进程
每个请求都是单独的线程,即时同时访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,不需要做同步处理。
相关文章推荐
- SpringMVC是单例的,高并发情况下,如何保证性能的?
- SpringMVC是单例的,高并发情况下,如何保证性能的?
- SpringMVC是单例的,高并发情况下,如何保证性能的?
- 高并发情况下如何保证消息的顺序
- 11.38 CastleActiveRecord中如何保证多线程并发操作的安全与成功?
- 简述如何提高单机下服务器的高并发性能
- spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
- 如何处理高并发情况下的DB插入
- 深入分析虚拟机创建对象的两种方式以及如何在并发情况下实现线程安全
- 数据库并发情况下什么情况会出现脏读,如何防范脏读
- 如何测试一个网站的性能(并发数)?
- 使用Google的开源TCMalloc库,提高MySQL在高并发情况下的性能
- spring boot / cloud (十九) 并发消费消息,如何保证入库的数据是最新的?
- IOS-如何处理多个网络请求的并发的情况
- 如何在保证睡眠的情况下高效学习工作?
- 树形模糊查询树,数据达到一定量,如何才能保证性能,保证加载树不卡
- 移动APP性能——如何保证高质量
- APP爆炸性增长的时代,如何保证其高质量性能?
- 高并发下如何保证数据的一致性
- 如何在需求不明确的情况下保证测试质量