zoukankan      html  css  js  c++  java
  • 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>。

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

  • 相关阅读:
    跨域导致FormsAuthentication.Decrypt报错:填充无效,无法被移除
    Php构造函数construct的前下划线是双的_
    DNN学习资源整理
    改进housemenu2使网站导航亲Seo并在新窗口中打开。
    推荐10款非常优秀的 HTML5 开发工具
    Ext.Net系列:安装与使用
    Devexpress 破解方法
    Microsoft Visual Studio 2010 遇到了异常,可能是由某个扩展导致的
    浮躁和互联网
    chrome 默认以 https打开网站
  • 原文地址:https://www.cnblogs.com/jenkov/p/spring_multi_threads.html
Copyright © 2011-2022 走看看