ThreadLocal 线程范围的共享变量

ThreadLocal 线程范围的共享变量_第1张图片


上图说明的是 比如两个转账线程 ,需要有事务控制,当然这个事务控制需要时connection级别的,因此两个线程都要有自己的connection ,并且互不影响,这样当一个事务提交的时候 才不会影响另一个事务的的状态,通过把connection设置为ThreadLocal变量 不同的线程使用各自的connection。

下面 展示的是 使用ThreadLocal变量 来为两个线程分配数据

ThreadLocal 线程范围的共享变量_第2张图片

在主线程里面开辟了两个子线程,同时在主类里面设置了一个静态成员变量x为ThreadLocal类型,两个线程分别产生一个随机数,并放到自己的线程共享变量中,然后再调用

A模块 从该线程中取出该数据,调用B模块从该线程中取出数据,运行结果为 线程1的A和B模块取出的数据为线程1的存储数据,线程2的A和B模块取出的为线程2的存储数据

因为ThreadLocal底层 是通过hashmap实现的,所以一个线程key 只能对应一个value,如果要一个线程共享两个变量就需要设置两个ThreaLocal变量,但是我们实际上是没有必要的,因为我们可以共享一个对象,一个Thread key对应一个对象,对象里面可以存放多个值,从而实现 一个ThreadLocal变量存储多个共享数据。


下面介绍一个Threadlocal在单例模式的应用,

ThreadLocal 线程范围的共享变量_第3张图片

正常情况下,我们的单例模式的getInstance()方法是需要加上synchronized的关键字的,因为当一个线程进入到了new MyThreadScopeData()部分的时候,另一个线程也进来了 就会new 出两个对象,当然后一个对象会覆盖前一个对象,现在我们对他进行改造,我们把MyThreadScopeData对象作为一个变量 存入ThreadLocal中,这样我们每个线程拿到的instance也都是每个线程的instance  互不影响,每个线程都会有自己的线程范围内的共享MyThreadLocal对象,我们拿到这个对象后可以对这个对象做任何操作,都会不会对其他线程有任何影响,因为这个每个线程都只会使用同一个MyThreadlocal对象。 这种方式比把ThreadLocal内存储对象 再拿对象要优雅。相当于 把与线程相关的数据和处理都集成到了一个类,专门用来处理与线程相关的内容。


但是这里有一个问题,每个线程到来的时候都会new 一个属于该线程的对象出来,我们并没有为每个线程死亡的时候消除依附于这个线程而生的数据对象。





 

你可能感兴趣的:(多线程)