`
zk_chs
  • 浏览: 215884 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ThreadLocal 多线程中对象引用的理解

 
阅读更多

这次的博客带来的是关于ThreadLocal<T>的理解

 

什么是ThreadLocal呢?根据名称来看,ThreadLocal即线程本地的意思。另外它还是一个范型类,这个范型T,就是threadLocal.set(T)的参数,也是threadLocal.get()、threadLocal.initialValue()的返回值。

public class ThreadLocal<T> {
      omitted ......
}

 

那么ThreadLocal又是如何区分不同线程的呢?

在ThreadLocal类内,还有一个静态内部类ThreadLocalMap

// ThreadLocalMap is a customized hash map suitable only for 
// maintaining thread local values.
static class ThreadLocalMap {
      static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
      omitted ......
}

 

 这个内部类,是一个自定义的hashmap,内部Entry的构造函数需要一个ThreadLocal,以及与这个ThreadLocal关联的对象。

 

但是我们又会发现,ThreadLocalMap类的实例却没有在ThreadLocal中声明,而是在Thread类中

public class Thread implements Runnable {
      /* ThreadLocal values pertaining to this thread. This map is maintained
       * by the ThreadLocal class. */
      ThreadLocal.ThreadLocalMap threadLocals = null;
      omitted ......
}

每个Thread维护一个ThreadLocalMap映射表,这个映射表的key是ThreadLocal实例本身,value是真正需要存储的Object。

 

 所以知道了,在ThreadLocal中并没有进行copy操作,不像以前理解的拷贝副本那样,下面举一个例子:

public class ThreadLocalTest {
	
	private static People people = new People();
	
	private static ThreadLocal<People> threadLocal = new ThreadLocal<People>(){
		public People initialValue(){
			return people;
		}
	};
	
	public static void main(String[] args) throws InterruptedException {
		new Thread(new Runnable() {
			@Override
			public void run() {
				threadLocal.get().age = 5;
				System.out.println("people = " + threadLocal.get() +  "age = " + threadLocal.get().age);
			}
		}).start();
		
		Thread.sleep(10);
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("people = " + threadLocal.get() +  "age = " + threadLocal.get().age);
			}
		}).start();
	}

}

class People {
	public int age;
}

 这样一来,在任何一个thread中修改people对象的age,都能够在另外的一个线程中看到

打印结果:

people = thread.People@6f5ab880age = 5

people = thread.People@6f5ab880age = 5

 

如果将threadLocal中的initialValue()的返回值改为new People,那么才不会相互影响

private static ThreadLocal<People> threadLocal = new ThreadLocal<People>(){
		public People initialValue(){
			return new People();
		}
	};

 打印结果为:

people = thread.People@44bacfa2age = 5

people = thread.People@44bacfa2age = 0

 

 

当然,文章还有很多没有讲,比如如何set,不过不想继续贴源码了,到此为止

 

分享到:
评论

相关推荐

    ThreadLocal

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

    Java中ThreadLocal的设计与使用

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,...总之,ThreadLocal是Java多线程编程中的一个强大工具,但使用时需谨慎,理解其工作原理和潜在风险,才能更好地利用它来解决实际问题。

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

    ThreadLocal是Java中的一个非常重要的线程安全工具类,它在多线程编程中扮演着独特的角色。通过创建ThreadLocal实例,我们可以为每个线程提供一个独立的变量副本,这些副本在各个线程之间互不影响,从而实现线程局部...

    设计模式及ThreadLocal资料

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。...在实际开发中,灵活运用设计模式可以提高代码质量,而ThreadLocal则为处理多线程环境下的数据隔离提供了一种有效手段。

    java中ThreadLocal类的使用

    总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多线程环境下隔离数据,避免了传统的同步机制。但是,使用时需注意其潜在的内存泄漏风险和对代码可读性的影响,合理地选择使用...

    java 简单的ThreadLocal示例

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,尤其在处理线程间数据隔离和共享时。ThreadLocal不是线程本身,而是为每个线程提供一个独立的变量副本,使得每个线程都可以独立地改变...

    threadLocal

    1. 多线程:理解ThreadLocal的使用必须建立在对多线程的理解基础上,包括线程的创建、执行、同步机制等。 2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3....

    ThreadLocal_ThreadLocal源码分析_

    **ThreadLocal概述** ThreadLocal是Java中的一个线程局部变量类,它...通过理解ThreadLocal的原理和最佳实践,我们可以更有效地利用它来解决多线程环境下的数据隔离问题,同时也需要注意防止可能出现的内存泄漏风险。

    使用ThreadLocal管理“session”数据

    在Java编程中,ThreadLocal是线程局部变量的类,它提供了一种在多线程环境中为每个线程创建和维护独立副本的机制。ThreadLocal主要用于解决线程间的数据隔离问题,确保各线程拥有自己的变量副本,避免了数据共享带来...

    简单分析Java线程编程中ThreadLocal类的使用共

    Java线程编程中的ThreadLocal类是一个非常重要的工具,它在多线程环境下提供了一种线程局部变量的机制。ThreadLocal并非是简单的变量,而是一种能够确保每个线程都拥有独立副本的变量容器。理解ThreadLocal的工作...

    深入理解 Java 之 ThreadLocal 工作原理1

    在ThreadLocal的set方法中,首先获取当前执行代码的线程对象(Thread t = Thread.currentThread();),然后尝试获取或创建该线程的ThreadLocalMap(ThreadLocalMap map = getMap(t);)。如果当前线程还没有...

    ThreadLocal 内存泄露的实例分析1

    总结:`ThreadLocal` 是一个强大的工具,但在使用时必须谨慎,尤其是在多线程环境中,如 Tomcat 这样的 Web 容器。如果不正确地管理 `ThreadLocal` 的生命周期,可能导致类加载器级别的内存泄漏。理解 `ThreadLocal`...

    ThreadLocal简单Demo

    在Java编程中,`ThreadLocal`是一个非常重要的工具类,它用于在多线程环境中提供线程安全的局部变量。`ThreadLocal`并不是一个线程,而是一个线程局部变量的容器,每个线程都有自己的副本,互不干扰。这使得线程间的...

    ThreadLocal,你真的了解吗?

    总结,ThreadLocal 提供了一种线程隔离的变量存储方式,而 Java 中的四种引用类型则帮助我们更好地控制对象的生命周期和内存管理,理解这些概念对于理解和使用 ThreadLocal 至关重要,同时也是面试中经常考察的知识...

    多线程基础部分.md,学习代码

    “ThreadLocal.md”是关于Java中的ThreadLocal类,它为每个线程提供了一个独立的变量副本,避免了线程间的数据共享问题,从而简化了多线程编程。然而,如果不正确地使用ThreadLocal,可能会导致内存泄漏,这正是...

    ThreadLocal_ThreadLocal源码分析_源码.zip

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境下提供线程局部变量。它为每个线程创建了一个独立的变量副本,每个线程只能访问自己的副本,不会影响其他线程。ThreadLocal的设计思想是解决共享数据在多线程...

    java并发包源码分析(3)ThreadLocal

    ThreadLocal提供了一种在多线程环境下使用“共享变量”的方式,但是它实际上是为每个线程提供一个变量的副本,这样每个线程都可以独立地改变自己的副本,而不会影响到其他线程中的副本。 ### 知识点一:ThreadLocal...

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

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提升系统效率。在多线程环境中,变量共享是一个常见的需求,但也是引发问题的关键点。本篇文章将深入探讨Java多线程下变量共享的问题以及解决...

Global site tag (gtag.js) - Google Analytics