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多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
随机推荐
- Jenkins 集成 git .net 和nuget
1. 源码配置 在 Credentials中配置 git 账号密码(如果是Gitee 可以使用 Jenkins Gitee Plugin) 2. 构建编译版本 2.1 批处理的目的 还原Nuget包 ...
- XEvent--Demo--使用XEvent来捕获在数据库DB1上发生的锁请求和锁释放
--==============================================================--使用XEvent来捕获在数据库DB1上发生的锁请求和锁释放--=== ...
- 关于Office软件中Word输入时卡顿无反应的解决办法!
最近在安装office2013时遇到了这样一个问题,就是在激活office之后,打开Word输入内容时十分卡顿.也是狂搜网上各种办法,有说改注册表的,也有说在office选项里设置什么输入法的,全试了 ...
- [.net]ConcurrentBag源码分析
ConcurrentBag根据操作线程,对不同线程分配不同的队列进行数据操作.这样,每个队列只有一个线程在操作,不会发生并发问题.其内部实现运用了net4.0新加入的ThreadLocal线程本地存储 ...
- 比特币的TxHash为什么会发生改变
比特币中TxHash为什么会变化? 一直不理解比特币的Tx在被打包确认之前TxHash为什么会发生变化,这次终于找到了依据. 交易可延展性 虽然交易签名后,签名当前不会覆盖经过哈希处理以创建事务哈希的 ...
- 微信企业号发送监控消息【php】
公司这边有做监控异常并将消息发送到企业公众号的功能.大概如下: 定时任务检测异常消息 将消息存入redis队列 定时处理队列异常消息 发送到微信企业号对应的部门组 这里我们来看一下微信发送过程,其他不 ...
- Stacking方法详解
集成学习方法主要分成三种:bagging,boosting 和 Stacking.这里主要介绍Stacking. stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略. 首 ...
- SVN教程 -- 基于自己学习记录
SVN教程 -- 基于自己学习记录 1. 概述 a. 什么是SVN? Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统.相较于 git ,svn 是集中式版本控 ...
- 为什么在AI领域网络安全更重要?先睹为快~
AI迎来了改变世界的新机遇,同时也迎来了新的网络安全问题,只要是联网的系统就会有漏洞爆出~ 随着大数据的应用,人工智能逐渐走入千家万户并显示出巨大的市场空间,从机器人客服.自动驾驶汽车到无人机等,全都 ...
- Linux 环境变量加强
Linux 环境变量加强 # 前言 今天,主要是之前搭建 GO 环境包的使用发现自己对 Linux 环境变量还不是很熟悉. 遇到环境变量的问题还是会有些懵逼.所以,今天写点Linux 环境变量的文章, ...