天天看点

线程封闭之ThreadLocal和栈封闭

线程封闭:

线程不安全是因为多线程在访问共享的可变数据时,会发生数据的不一致,结果不正确. 实现好的并发是一件困难的事情, 那么如何解决呢,一个是使用同步,但是同步需要占用资源,另外一种方式,如果一个线程访问这个数据,就不会出现问题, 所以很多时候我们都想躲避并发. 避免并发最简单的方法就是线程封闭. 什么是线程封闭; 就是把对象封装到一个线程里,只有这个线程能看到此对象. 那么这个对象就算不是线程安全的也不会出现任何问题.

线程封闭的实现方式:

  1. Ad-hoc : 维护线程封闭性的职责完全由程序实现来承担,是非常脆弱的, 因为没有任何一种语言特性, 能将对象封闭到目标线程上.
  2. 栈封闭 : 简单的来说就是局部变量. 多个线程访问一个方法,此方法中的局部变量都会拷贝一份到线程栈中,. 所以局部变量是不被多个线程所共享,也就不会出现并发问题,所以能用局部变量就别用全局变量, 全局变量容易引起并发问题.
  3. ThreadLocal封闭 : 使用ThreadLocal是实现线程封闭的最好方法. ThreadLocal内部维护了一个Map, Map的key是每个线程对象,而Map的值就是我们要封闭的对象(数据) . 每个线程中的对象都对应这Map中的一个值, 也就是ThreadLocal利用Map实现了对象的线程封闭.