ThreadLocal

91 阅读1分钟

单线程里的数据是线程封闭的,不存在线程安全,ThreadLocal是为了解决多线程环境中,能保证线程安全。ThreadLocal是如何保证的呢?其实它不存在线程安全性问题,因为每个线程操作的都是变量的副本,多个线程的副本互不影响。

ThreadLocal变量是为了解决对象的操作频率很高,而且创建分配的开销也很高,这种情况下建议使用。因为ThreadLocal变量跟线程挂钩,只有等线程终止了,ThreadLocal变量才会被回收。

局部变量、成员变量、全局变量、ThreadLocal变量

  1. 局部变量:作用于方法中或代码块中,方法内部或代码块内部共享,多线程环境下,变量初始化到线程自己的内存中,主内存不存在该变量,所以线程之间不共享。
  2. 成员变量:作用于类实例中,类实例共享,多线程环境下,变量初始化到主内存,每个变量拷贝到工作内存中操作,线程直接共享一个主内存,有线程安全问题。
  3. 全局变量:static变量,作用于类,类共享,多线程环境下,变量初始化到主内存,每个变量拷贝到工作内存中操作,线程直接共享一个主内存,有线程安全问题。
  4. ThreaLocal变量:作用于线程内部,线程之前不共享。它跟局部变量的区别是,ThreadLocal变量只创建一次,多线程使用的是变量的副本。