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>。

上面只是简要介绍思路,更多详细内容,可查阅相关资料。

 

posted @ 2017-10-18 00:13  无名码者  阅读(3850)  评论(0编辑  收藏  举报