线程作用域变量-ThreadLocal
前面我们讲到,Synchornized 可以保证多个线程之间的通讯。那么在多线程系统中要求每个线程都有自己的全局变量的时候,
使用ThreadLocal 就是一个最佳选择。
ThreadLocal 用于实现单线程内的数据共享,即在同一个线程中运行多个模块并且它们要共享一份数据,而在另一个线程中又共享另一份数据。
比较典型的例子就是,JDBC中的Collection ,当由用户发起一个线程,在这个线程中将执行多个方法,比如增,删,改,查,而这些操作必须在一个事物里完成,
那么就可以使用 ThreadLocal 来限制Collection.保证Collection/Trasaction的唯一性。
ThreadLocal跟static 的区别
既然ThreadLocal 也是全局变量,是不是可以用 static 呢?那么,我们首先回顾一下static 的定义,static 修饰的变量在JVM 只有一份,
它是实现单个线程多个模块共享,但是也实现了多个线程共享,作用域太大了,不满足业务需求。
与同步机制(Synchronized)的关系
ThreadLocal和Synchronized 都是用来解决并发问题的。
对于多线程共享的问题,Synchronized采取”时间换空间“,ThreadLocal采取空间换时间,因为ThreadLocal为每个线程提供了变量的副本,如上面提到的Connection,
每当用户发起一个线程,那么这个线程就拥有一个Connection的副本。
不过ThreadLocal不能替代Synchronized,他们被用来解决不同的问题,ThreadLocal 考虑的是不同线程之间资源的隔离,Synchronized 提供了线程之间通信的桥梁。
前面我们讲到,Synchornized 可以保证多个线程之间的通讯。那么在多线程系统中要求每个线程都有自己的全局变量的时候,
使用ThreadLocal 就是一个最佳选择。
ThreadLocal 用于实现单线程内的数据共享,即在同一个线程中运行多个模块并且它们要共享一份数据,而在另一个线程中又共享另一份数据。
比较典型的例子就是,JDBC中的Collection ,当由用户发起一个线程,在这个线程中将执行多个方法,比如增,删,改,查,而这些操作必须在一个事物里完成,
那么就可以使用 ThreadLocal 来限制Collection.保证Collection/Trasaction的唯一性。
ThreadLocal跟static 的区别
既然ThreadLocal 也是全局变量,是不是可以用 static 呢?那么,我们首先回顾一下static 的定义,static 修饰的变量在JVM 只有一份,
它是实现单个线程多个模块共享,但是也实现了多个线程共享,作用域太大了,不满足业务需求。
与同步机制(Synchronized)的关系
ThreadLocal和Synchronized 都是用来解决并发问题的。
对于多线程共享的问题,Synchronized采取”时间换空间“,ThreadLocal采取空间换时间,因为ThreadLocal为每个线程提供了变量的副本,如上面提到的Connection,
每当用户发起一个线程,那么这个线程就拥有一个Connection的副本。
不过ThreadLocal不能替代Synchronized,他们被用来解决不同的问题,ThreadLocal 考虑的是不同线程之间资源的隔离,Synchronized 提供了线程之间通信的桥梁。