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

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

  • 相关阅读:
    Unity游戏开发之AR增强现实技术入门
    python3快速入门
    大数据Hadoop入门到精通 (精品课程)
    JavaScript基础训练营
    我的超级工具
    html5 postMessage 实现类似 sendMessage 的同步效果,支持跨域
    Centos7-驱动小米WIFI做AP
    rz快速上传文件到ssh服务器
    Ansible批量修改root密码
    ArcGIS API for JavaScript 入门教程[0] 目录
  • 原文地址:https://www.cnblogs.com/jenkov/p/spring_multi_threads.html
Copyright © 2011-2022 走看看