目录
一、线程封闭
1.概念
线程封闭:当访问共享的可变数据时,通常需要同步。一种避免同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步,这种技术称为线程封闭(thread confinement)。
2. 线程封闭的几种策略
① Ad-hoc 线程封闭:
维护线程的封闭性的职责完全由程序实现承担,是非常脆弱的,因此在程序中尽量少使用,一般使用更强的线程封闭技术,比如栈封闭或者ThreadLocal类,最糟糕,【忽略】;
② 堆栈封闭:
- 局部变量,没有并发问题;
- 堆栈封闭是线程封闭的一种特列,在栈封闭中,只能通过局部变量才能访问对象。局部变量的固有属性之一就是封闭在执行栈中,其他线程无法访问这个栈,栈封闭也称为线程内部使用或者线程局部使用。简单的说就是局部变量。多个线程访问一个方法,此方法中的局部变量都会被拷贝一分儿到线程栈中。所以局部变量是不被多个线程所共享的,也就不会出现并发问题。所以能用局部变量就别用全局的变量,全局变量容易引起并发问题。
- 我们日常在开发的接口时,以及平时的代码运行过程中,之所以没有出现并发问题,是因为绝大多数情况都是在类里定义局部变量,然后对变量进行一系列操作,这就属于堆栈封闭,因此不会发生并发问题;
③ThreadLocal
线程封闭:
- 特别好的封闭方法;
- 通俗的理解:
ThreadLocal
内部维护了一个Map,Map中的key为每个线程的名称,Map的value是每个封装的对象,每一个线程中的对象都对应中Map中的value,因此ThreadLocal
利用Map实现了线程的封闭;
二、ThreadLocal
类
1.ThreadLocal
类使用示例
ThreadLocal
类提供了get和set等访问接口或者方法,这些方法为每个使用该变量的线程都存在一份独立的副本,因此get总是放回当前执行线程在调用set设置的最新值。看一下下面代码例子:
public class ConnectionManager {
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
public Connection initialValue() {
Connection conn = null