在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多线程编程的更多相关文章

  1. JavaEE开发之Spring中的多线程编程以及任务定时器详解

    上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...

  2. spring多线程与定时任务

    本篇主要描述一下spring的多线程的使用与定时任务的使用. 1.spring多线程任务的使用 spring通过任务执行器TaskExecutor来实现多线程与并发编程.通常使用ThreadPoolT ...

  3. Swing多线程编程(转)

    关键字: Swing,多线程,GUI,SwingWorker 摘要: 本文论述了怎样开发多线程的Swing程序,从而提高Swing程序的响应速度和性能.     近期,我将推出一系列研究Swing程序 ...

  4. 《Java 多线程编程核心技术》- 笔记

    作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...

  5. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  6. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  7. windows多线程编程实现 简单(1)

    内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...

  8. Rust语言的多线程编程

    我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...

  9. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

随机推荐

  1. mysql in语句在java中的使用

    做权限的时候,通过role角色中的roleid,在auth权限中查找角色对应的权限. sql语句: SELECT authName from auth where authId in (1,2,3,4 ...

  2. django model中的save()方法

    Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None) id和pk ...

  3. C#——Winform 无边框随意拖动【转载】

    本篇技术内容转载自:http://www.cnblogs.com/ap0606122/archive/2012/10/23/2734964.html using System; using Syste ...

  4. 自己从0开始学习Unity的笔记 IV (C#循环练习输出素数)

    来测试一下循环....刚刚学了while循环,测试一下输出1-100的素数 我想了一下,素数就是只能被1和本身整除,那就是只能被整除2次,我是顺着这个思路写的代码,如果被整除超过2次,那么肯定不是素数 ...

  5. 开源应用框架BitAdminCore重构再思考

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:https://www.bitadmincore.com 框架源码:https://github.com/chenyi ...

  6. WPF TriggerAction弹出子窗体 TargetedTrigger、TargetedTriggerAction用法

    namespace TriggerAction { public class OpenWindowAction : TriggerAction<DependencyObject> { pu ...

  7. Photoshop的脚本开发

    之前的博客的文章,贴过来了.PhotoshopCS开始增加了脚本.Photoshop的脚本可以用JavaScript,AppleScript以及VbScript和visualBasic.其中Apple ...

  8. 第四界css大会 黑魔法-css网格背景、颜色拾取器、遮罩、文字颜色渐变、标题溢出渐变等

    1.css网格背景 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. 调用jdbc已经写成的方法----jdbc工具类抽取方式一

    package web09; /*获取连接和释放资源的方法 */ import java.sql.Connection; import java.sql.DriverManager; import j ...

  10. C#-集合及特殊集合——★★哈希表集合★★

    集合的基本信息: System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位组数.哈希表和字典)的集合. System.Collections.Generic ...