java并发和高并发之线程封闭

46 篇文章 0 订阅
12 篇文章 0 订阅

一、线程封闭:

1、概述;线程安全策略,除了不可变对象,还有一个简单的方法就是线程封闭。线程封闭其实就是把对象封装到一个线程里,只有这一个线程能看到这个对象,那么这个对象本身就算不是线程安全的,也不会出现任何线程安全问题,因为它只能出现在一个线程里。

2、实现线程封闭的几个方法:

》Ad-hoc 线程封闭:完全靠程序控制实现,非常脆弱,最糟糕,忽略;

》堆栈封闭:局部变量,无并发问题。被使用的最多的方法,因为多个线程访问一个方法时,方法的局部变量都会被拷贝一份到线程的栈中,所以局部变量是不会被多个线程所共享的,因此不会出现并发问题。可以查看java内存模型。所以能用局部变量时,不要使用全局变量。

》ThreadLocal线程封闭:特别好的封闭方法。ThreadLocal中维护了一个map,其中线程的名称作为key,要封闭的对象作为value.每一个线程中的对象都对应map中的一个值。也就是说,ThreadLocal利用map 实现了线程封闭。

3、代码示例threadLocal的用法:

1)示例场景:threadLocal结合loginFilter实现登录请求拦截功能。

方法:将用户信息存放到threadLocal中,在请求对应的线程,任何有需要获取当前登录用户信息的地方,都可以方便地取出。由于threadLocal是线程间封闭的,也不需要担心任何线程安全问题。

   对于服务器而言,任何一个用户请求都是一个线程。我们希望线程间隔离。通过threadLocal和loginFilter 过滤器结合,可以实现在接口处理之前先取出相关的信息,在接口实际使用时,何时需要,何时获取。而避免了每次请求要传递用户基本信息,可能要传递很多层的麻烦,代码臃肿和其他安全性等问题。

2)代码演示过程。

》先创建一个RequestHolder,用于控制(操作)想要绑定到threadLocal中的信息。在其中声明一个threadLocal对象

为该类创建一个添加存放对象的方法add()  、一个获取该对象的getId()方法,最后不要忘记创建一个移除存放到threadLocal中信息的remove()  方法。

如上,实质就是一个操作threadLocal的工具类,包括,向threadLocal中添加、查询、移除信息的方法。

那,如上方法何时调用呢?

add 当(比如登录)请求访问到服务器,但没有实际处理时,调用该方法,被拦截器拦截,在拦截器中将相应信息写入到threadLocal中。当再次有请求实际处理,需要获取信息时,调用get方法,而当请求 实际处理完结束时,将请求存储的信息从threadLocal中移除。即调用remove方法。此时我们容易想到intercepter中 调用方法前和后分别执行的操作。

先书写过滤器:

创建Intercepter:

在application中配置interceptor  和 过滤器 :

写Controller接口进行验证:

运行项目,通过浏览器或者postman等方式访问controller层的访问接口,

 注上方的整个springboot 中,使用threadLocal 的代码运行流程:

使用threadLocal时定义了三个方法,分别是存放 获取 移除数据。存放数据通常是在过滤器(拦截器)中,先拦截住请求,然后存放数据。最后在interceptor中移除数据,防止内存泄露。在做接口处理时,可以实时地获取数据。

4、threadLocal 是线程安全的,使用比较容易。

5、扩展,线程封闭技术还有一个常用的,即jdbc中连接数据库的操作对象Connection, 该对象本身是一个线程不安全的对象,但是在服务器实际应用程序中,因为线程从连接池获取了一个Connection 对象,使用完之后返回给连接池,由于大多数请求是通过单线程采用同步进行处理的,并且在Connection对象返回连接池之前,不会将它分配给其他线程,因此这种管理方式,将连接请求隐式地存放在线程封闭之内,如此实现了,虽然Connection对象本身不是线程安全的,但是通过线程封闭做到了线程安全。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值