`
acanblog
  • 浏览: 3518 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ThreadLocal本地线程变量的理解

阅读更多

       一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程

       也就是说,同一线程贯通N层,不同的线程可能由于参数等不同会对程序中的某些变量进行修改,但是又要防止修改后的值对其它线程产生影响,因为不同的线程可以同时运行滴,这就需要我们解决对某些线程共享的变量的访问冲突问题。ThreadLocal本地线程变量就是一种解决方式,它通过将程序中不安全的变量封装进ThreadLocal中,这相当于为每一个线程提供一个独立的变量副本(其实是不同的对象),线程修改变量的值对其它线程来说没影响了,因为其它线程有自己的一个副本信息。



 

代码理解:

 

 

// 借助ThreadLocal对象每个线程只创建一个实例
public static final String dateFormat="yyyy-MM-dd";

private static final ThreadLocal<DateFormat> dfThreadLocal=new ThreadLocal<DateFormat>(){
	 @Override
	 protected DateFormat initialValue() {
		 return new SimpleDateFormat(dateFormat);
	 }
};

public static String dateToString(Date date){
	 return dfThreadLocal.get().format(date);
}

 

 

       对于每个线程,都有一个类似于Map的东西ThreadLocalMap(ThreadLocal的静态类 ),那它里面保存了什么东东呢,肯定是key-value啊,key就是上面代码中的共享静态变量 dfThreadLocal,value就是DateFormat实例了,即new SimpleDateFormat(dateFormat)这个东东。那接下来,在线程内我要如何去获取这个值呢,就是靠dfThreadLocal.get()实现滴,方法源码如下:

 

 

ThreadLocal .ThreadLocalMap inheritableThreadLocals = null ;

public T get () {
	Thread t = Thread.currentThread ();
        // 获取到inheritableThreadLocals
	ThreadLocalMap map = getMap(t );
	if ( map != null) {
                // this作为key,this就是本地线程变量,获取Entry
		ThreadLocalMap.Entry e = map.getEntry (this);
		if ( e != null)
			return ( T)e .value;
	}
	return setInitialValue ();
}

ThreadLocalMap getMap (Thread t) {
   return t .inheritableThreadLocals;
}

 

 

 

       可以很明显的看出,首先根据Thread.currentThread ()获取到inheritableThreadLocals(即ThreadLocalMap,他是Thread的一个变量),然后将this(即最上面代码的dfThreadLocal对象)作为key(或索引)获取到真正的值T(就是SimpleDateFormat对象)啊,至此应该比较清楚了,为什么不同的线程有各自的值,因为 不同的线程--->不同的ThreadLocalMap对象(线程的变量)--->通过相同的key(如果有被static修饰)获取到不同的value值。

       备注:一般都被static修饰,因为可以避免在一个线程内可能发生的重复创建TSO(Thread Specific Object,即ThreadLocal所关联的对象),被statis修饰了,同一线程key也肯定一样,value也肯定只有一份了。

       一个ThreadLocal实例关联当前线程的一个TSO对象,如果把ThreadLocal声明为实例变量,那么每创建一个类实例就会导致一个TSO实例诞生,这肯定没有这个必要滴。

 

更多文章请见我的个人博客:http://www.acanblog.com

 

  • 大小: 19.4 KB
0
0
分享到:
评论

相关推荐

    java ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    ThreadLocal 线程本地变量 及 源码分析.rar_开发_设计

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境下提供线程局部变量。它为每个线程创建了一个独立的变量副本,每个线程只能访问自己的副本,不会影响其他线程。这种机制有助于实现线程安全,尤其在需要线程...

    多线程线程变量赋值

    首先,我们需要理解线程变量(Thread Local Variables)的概念。线程变量,也称为线程局部变量,是一种特殊类型的变量,它为每个线程维护独立的副本。这意味着,即使多个线程访问同一个线程局部变量,它们各自看到的...

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    java线程本地变量ThreadLocal详解

    Java 线程本地变量 ThreadLocal 详解 ThreadLocal 是 Java 中的一个类,提供了线程安全的对象封装,用于解决多线程访问数据的冲突问题。ThreadLocal 的主要目的是为每个线程提供一个变量副本,从而隔离了多个线程...

    java 中ThreadLocal本地线程和同步机制的比较

    Java中的ThreadLocal是一种特殊的技术,它为每个线程提供了一个独立的变量副本,避免了多线程间的直接共享,从而简化了并发编程的复杂性。ThreadLocal不是一种同步机制,而是设计来解决线程间数据隔离问题的工具。 ...

    正确理解ThreadLocal.pdf

    随后的每次`get()`调用都将返回该线程本地变量的副本,从而保证了线程之间的隔离性。 #### 三、ThreadLocal的设置与获取 `ThreadLocal`提供了两个关键的方法: - `set(T value)`:用于将特定线程局部变量的值设为...

    ThreadLocal的简单理解.doc

    四、ThreadLocal 如何做到线程变量隔离 ThreadLocal 的秘密就在于它的三个类:ThreadLocal、ThreadLocalMap 和 Thread。 首先,ThreadLocal 类提供了一个简单的 set、get、remove 方法,用于设置、获取或移除绑定...

    Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    ThreadLocal并不是线程的本地实现,而是一个线程局部变量,它为每个线程提供了一个变量的副本,确保每个线程都可以独立地操作自己的副本,而不干扰其他线程。因此,ThreadLocal可以帮助我们在多线程环境下为每个线程...

    java多线程_java多线程下变量共享_

    Java多线程是Java编程中的重要概念,它允许...理解并掌握Java多线程下变量共享的原理和解决方案,有助于编写出高效、稳定的并发程序。在实际开发中,应结合具体业务场景选择合适的同步机制,以达到最佳性能和安全性。

    Java并发编程示例(九):本地线程变量的使用

    Java并发编程中的本地线程变量(ThreadLocal)是一种强大的工具,用于在线程内部维护独立的、隔离的变量副本。在上述示例中,问题在于多个线程共享同一个`startDate`属性,导致它们看到的是相同的值,而不是各自独立...

    ThreadLocal

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...

    线程并发时 本地变量和Lock锁的效率比较

    在Java中,可以使用`ThreadLocal`类来创建线程本地变量。使用本地变量可以简化代码,因为不需要进行同步操作,但需要注意的是,如果变量不再使用,记得及时清理,防止内存泄漏。 **Lock锁** Lock锁是一种显式同步...

    JDK的ThreadLocal理解(一)使用和测试

    通过创建ThreadLocal实例,我们可以为每个线程提供一个独立的变量副本,这些副本在各个线程之间互不影响,从而实现线程局部变量的功能。本文将深入探讨ThreadLocal的使用、原理以及一些实际应用中的测试案例。 ### ...

    ThreadLocal的几种误区

    ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...

    ThreadLocal相关

    在多线程环境下,ThreadLocal 变量可以保证各个线程的变量相对独立于其他线程内的变量。这种机制可以帮助开发者在多线程环境下编写更加简洁、可维护的代码。 ThreadLocal 的作用 ThreadLocal 的主要作用是提供线程...

    理解ThreadLocal

    ThreadLocal 并不是一个 Thread,而是 Thread 的局部变量,它为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 ThreadLocal 的接口方法...

    Java多线程编程之ThreadLocal线程范围内的共享变量

    Java中的ThreadLocal是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...

    ThreadLocal的用处

    ThreadLocal是Java编程语言中的一个强大工具,它主要用于在多线程环境中为每个线程提供独立的变量副本。这个机制确保了线程之间的数据隔离,避免了共享状态带来的并发问题,提高了程序的安全性和效率。ThreadLocal是...

Global site tag (gtag.js) - Google Analytics