一、前言
要理解ThreadLocal,首先必须理解线程安全。线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位。当程序以单线程运行的时候,我们不需要考虑线程安全。然而当一个进程中包含多个线程的时候,就需要考虑线程安全问题,因为此时线程可能会同时操作同一个资源,当两个或者两个以上线程同时操作一个资源的时候,就会造成冲突、不一致等问题,即线程不安全。
解决线程安全问题,本质上就是解决资源共享问题,一般有以下手段:
1)可重入(不依赖环境);2)互斥(同一时间段只允许一个线程使用);3)原子操作;4)Thread-Local
二、Thread-Local
Thread-Local是一个很简单的思想:如果一个资源会引起线程竞争,那就为每一个线程配备一个资源。这就是ThreadLocal需要做的事情。
三、ThreadLocal的用法
在理解ThreadLocal之前,首先看一下它的用法:
1 public class ThreadLocalTest { 2 public static ThreadLocal<Integer> intLocal = new ThreadLocal<Integer>() { 3 @Override 4 protected Integer initialValue() { 5 // TODO Auto-generated method stub 6 return 0; 7 } 8 9 @Override 10 public Integer get() { 11 // TODO Auto-generated method stub 12 set(super.get() + 1); 13 return super.get(); 14 } 15 16 @Override 17 public void set(Integer value) { 18 // TODO Auto-generated method stub 19 super.set(value); 20 } 21 22 @Override 23 public void remove() { 24 // TODO Auto-generated method stub 25 super.remove(); 26 } 27 }; 28 29 public static void main(String[] args) { 30 // TODO Auto-generated method stub 31 for(int index = 0; index < 3; index ++) 32 new MyThread(index).start(); 33 } 34 } 35 36 class MyThread extends Thread{ 37 int id; 38 39 public MyThread(int id){ 40 this.id = id; 41 } 42 43 @Override 44 public void run() { 45 // TODO Auto-generated method stub 46 for(int index = 0; index < 3; index ++){ 47 System.out.println("Thread-" + id + " : " + ThreadLocalTest.intLocal.get()); 48 try { 49 Thread.sleep((int)(100 * Math.random())); 50 } catch (InterruptedException e) { 51 // TODO Auto-generated catch block 52 e.printStackTrace(); 53 } 54 } 55 } 56 }