Spring多线程编程
在Spring框架下如何保证线程安全,如何很happy顺畅地并发编程。
常见的如下面的这坨代码,在Spring中,默认是单例的,也就是说,在同一时刻只有一个SpringOrdinaryClass的单实例。这时候如果类中有一个可变的成员变量,如VariableClass类型的var。在多
public class SpringOrdinaryClass {
private VariableClass var = new VaribaleClass();
public void run(){
}
//getter & setter
}
class VariableClass{
private int i;
private String s;
//getter & setter
}
线程同时访问的时候,显然是线程不安全的,每个线程都有修改var值得可能。
So,在Spring中我们应该怎么做?
我总结是两种情况:
一种是如果var的值需要被多线程共享,即线程A的修改希望被线程B知道,那么应该使用同步;
另一种是var的值不需要被共享,每个线程都想要单独保留一份自己的修改,并且各自的修改不会受到其他线程的影响,这时候应该使用ThreadLocal。
同步无非就是各种加锁,如果可变变量是集合等,还可以使用同步容器包装,或使用线程安全的容器替代,确保实例是被安全发布。在接下来的使用中,同样需要使用同步机制,确保线程安全。ThreadLocal方式,是典型的用空间换时间。客户端向服务器发起一次请求,有这么一个特点,即一个线程唯一对应一次http请求,只要确保线程不变,那么可以确保始终对应唯一的一个请求id。借助这条特性,开发者可以将一次请求的所有信息都绑定到当前线程上。不难想象ThreadLocal的内部实现,键就是当前线程,值为任何你想绑定到线程上的信息。通过get和set方法,开发者可以安全的访问和保存当前请求指定信息,做到线程安全。上面的代码可以改为private ThreadLocal<VariableClass> varThreadLocal = new ThreadLocal<VariableClass>。
上面只是简要介绍思路,更多详细内容,可查阅相关资料。
Spring多线程编程的更多相关文章
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- spring多线程与定时任务
本篇主要描述一下spring的多线程的使用与定时任务的使用. 1.spring多线程任务的使用 spring通过任务执行器TaskExecutor来实现多线程与并发编程.通常使用ThreadPoolT ...
- Swing多线程编程(转)
关键字: Swing,多线程,GUI,SwingWorker 摘要: 本文论述了怎样开发多线程的Swing程序,从而提高Swing程序的响应速度和性能. 近期,我将推出一系列研究Swing程序 ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- Web Worker javascript多线程编程(二)
Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...
- windows多线程编程实现 简单(1)
内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...
- Rust语言的多线程编程
我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
随机推荐
- 基于Extjs的web表单设计器 第二节——表单控件设计
这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基 ...
- cloudera search环境搭建搭建-solrcloud
转载:http://blog.csdn.net/xiao_jun_0820/article/details/40539291 本文基于Cloudera Manager5.0.0,所有服务基于CDH5. ...
- mysql5.7 创建新表时提示时间戳非法
# 背景 mysql版本5.7.8,需要创建新表,研发提供的sql文件,执行后报错如下: ERROR (): Invalid default value for 'deleted_at' 就猜测到时因 ...
- 上传文件时form表单需要添加的属性
enctype="multipart/form-data"
- 开源一款强大的文件服务组件(QJ_FileCenter)(系列三 访问接口与项目集成)
系列文章 1. 开源一款强大的文件服务组件(QJ_FileCenter)(系列一) 2. 开源一款强大的文件服务组件(QJ_FileCenter)(系列二 安装说明) 3. 开源一款强大的文件服务组件 ...
- cesium编程入门(四)界面介绍及小控件隐藏
感性认识 界面介绍,viewer Geocoder : 查找位置工具,查找到之后会将镜头对准找到的地址,默认使用bing地图 Home Button :视角返回初始位置. Scene Mode Pic ...
- .NET处理HTTP请求
第一种:使用HttpWebRequest string result = ""; HttpWebRequest request = (HttpWebRequest)WebReque ...
- WPF文字间距
代码: <ItemsControl ItemsSource="{Binding Info}" FontFamily="微软雅黑" FontSize=&qu ...
- Modular Arithmetic ( Arithmetic and Algebra) CGAL 4.13 -User Manual
1 Introduction Modular arithmetic is a fundamental tool in modern algebra systems. In conjunction wi ...
- 回去看linux的指令1
SYNC CL : MSM8953 @ CL#:12212299 PROJECT PATH : // Platform / N / NILE / COMBINATION / MSM8953 Cross ...