Spring 如何处理线程并发问题?

迷失技术de小猪 Spring 115
  1. Spring 使用 ThreadLocal 解决线程安全问题
  2. 我们知道在一般情况下,只有无状态的 Bean才可以在多线程环境下共享,在 Spring中,绝大 部分 Bean 都可以声明为 singleton 作用域。就 是因为 Spring 对一些 Bean(如 RequestContextHolder、 TransactionSynchronizationManager、 LocaleContextHolder等)中非线程安全状态采 用 ThreadLocal 进行处理,让它们也成为线程安 全的状态,因为有状态的 Bean就可以在多线程 中共享了。
  3. ThreadLocal 和线程同步机制都是为了解决多线 程中相同变量的访问冲突问题。
  4. 在同步机制中,通过对象的锁机制保证同一时间 只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么 时候对变量进行读写,什么时候需要锁定某个对 象,什么时候释放对象锁等繁杂的问题,程序设 计和编写难度相对较大。
  5. 而 ThreadLocal 则从另一个角度来解决多线程的 并发访问。ThreadLocal 会为每一个线程提供一 个独立的变量副本,从而隔离了多个线程对数据 的访问冲突。因为每一个线程都拥有自己的变量 副本,从而也就没有必要对该变量进行同步了。 ThreadLocal 提供了线程安全的共享对象,在编 写多线程代码时,可以把不安全的变量封装进 ThreadLocal。
  6. 由于 ThreadLocal 中可以持有任何类型的对象, 低版本 JDK 所提供的 get()返回的是 Object 对 象,需要强制类型转换。但 JDK5.0通过泛型很 好的解决了这个问题,在一定程度地简化 ThreadLocal 的 使 用 。
  7. 概括起来说,对于多线程资源共享的问题,同步 机制采用了“以时间换空间”的方式,而 ThreadLocal 采用了“以空间换时间”的方式。 前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可 以同时访问而互不影响。

回复

我来回复
  • 暂无回复内容

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部