`

Java中的ThreadLocal

    博客分类:
  • Java
阅读更多

再了解ThreadLocal之前先看一个简单的Java线程示例。

线程类:

public class TestThread2 extends Thread {
	int a;
	String b = "a";

	@Override
	public void run() {
		for (int i = 1; i <= 3; i++) {
			System.out.println(Thread.currentThread().getName() + " " + a + " "
					+ b);
			a++;
			b = "" +(char)(b.charAt(0)+1);
		}
	}
}

主测试类代码:

public class MainTest {
	public static void main(String[] args) {
		Runnable test = new TestThread2();
		Thread a1 = new Thread(test,"线程1");
		Thread a2 = new Thread(test,"线程2");
		Thread a3 = new Thread(test,"线程3");
		//a1,a2,a3共享test对象的实例变量
		
		a1.start();
		a2.start();
		a3.start();
	}
}

 某个输出结果为:

线程1 10 a
线程1 11 b
线程1 12 c
线程2 13 d
线程3 14 e
线程2 14 e
线程2 15 f
线程3 17 g
线程3 18 h

        由结果可以看到,test对象里的a,b变量被几个线程共享,所以他们的结果累加了。当然如果改变一种写法,几个线程不通过test对象创建,则不构成共享对象,那么几个都只用自己的成员变量,结果就会不一样了。代码:

public class MainTest {
	public static void main(String[] args) {
		//Runnable test = new TestThread2();
		Thread a1 = new Thread(new TestThread2(),"线程1");
		Thread a2 = new Thread(new TestThread2(),"线程2");
		Thread a3 = new Thread(new TestThread2(),"线程3");
		 
//		Thread a1 = new TestThread2();
//		Thread a2 = new TestThread2();
//		Thread a3 = new TestThread2();
		
		a1.start();
		a2.start();
		a3.start();
	}
}

 运行结果为:

线程1 0 a
线程3 0 a
线程1 1 b
线程1 2 c
线程3 1 b
线程3 2 c
线程2 0 a
线程2 1 b
线程2 2 c

        好了,现在的问题就是能不能让共享的对象里的变量也有上面等效的结果,每个对象都把共享的对象属性处理成自己的局部变量。ThreadLocal就是用来达到这个目的的。更改线程类代码为:

public class TestThread2 extends Thread {

	private static ThreadLocal<Integer> a = new ThreadLocal<Integer>() {
		@Override
		protected Integer initialValue() {
			return 0;
		}
	};

	private static ThreadLocal<String> b = new ThreadLocal<String>() {
		@Override
		protected String initialValue() {
			return "a";
		}
	};

	@Override
	public void run() {
		for (int i = 1; i <= 3; i++) {
			System.out.println(Thread.currentThread().getName() + " " + a.get()
					+ " " + b.get());
			a.set(a.get() + 1);
			b.set("" + (char) (b.get().charAt(0) + 1));
		}
	}
}

 再次运行共享test对象的主程序测试类,打印结果如下:

线程1 0 a
线程2 0 a
线程2 1 b
线程2 2 c
线程3 0 a
线程3 1 b
线程3 2 c
线程1 1 b
线程1 2 c

 对于ThreadLocal的一般解释:

写道
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadLocalVariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。

 ThreadLocal类位于java.lang下,即java.lang.ThreadLocal,对于这个类的解读和实现分析,网上已经有不少了:

http://sishuok.com/forum/blogPost/list/340.html

http://blog.csdn.net/qjyong/article/details/2158097

http://lavasoft.blog.51cto.com/62575/51926/

http://my.oschina.net/lichhao/blog/111362

http://www.iteye.com/topic/103804

 

用自己的话再解释一下:

每个java.lang.Thread线程类里都有一个ThreadLocalMap成员属性(打开源码就能看见):

ThreadLocal.ThreadLocalMap threadLocals = null;

ThreadLocalMap是ThreadLocal的静态内部类。Thread里的这个threadLocals成员属性就是用来存储各个ThreadLocal的key-value映射的。这里的key就是ThreadLocal对象,值就是ThreadLocal里设定的值。拿上面的代码线程类为例:线程a1中的threadLocals存储了两个key-value对,一个是a(ThreadLocal型)-0(int型),另一个是b(ThreadLocal型)-"a"(字符串型)。线程a2,a3同理。

分享到:
评论

相关推荐

    java中ThreadLocal详解

    ### Java中ThreadLocal详解 #### 一、ThreadLocal概述 在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,...

    Java中ThreadLocal的设计与使用

    Java中的ThreadLocal是一个非常重要的工具类,它在多线程编程中扮演着独特角色,用于为每个线程提供独立的变量副本。理解ThreadLocal的工作原理和使用方法对于编写高效、安全的多线程程序至关重要。 ### ...

    java中ThreadLocal类的使用

    Java中的`ThreadLocal`类是一个非常实用的工具,它提供了线程局部变量的功能。线程局部变量意味着每个线程都拥有自己独立的变量副本,互不干扰,这在多线程编程中尤其有用,可以避免数据共享带来的同步问题。下面...

    java 中ThreadLocal 的正确用法

    java 中ThreadLocal 的正确用法 ThreadLocal 是 Java 中的一个特殊类,它可以让每个线程拥有自己独立的变量副本,避免了多线程之间的共享变量问题。下面我们将详细介绍 Java 中 ThreadLocal 的正确用法。 用法一...

    java 中ThreadLocal实例分析

    "Java 中ThreadLocal实例分析" Java 中的 ThreadLocal 实例分析是指在多线程环境下,如何使用 ThreadLocal 来实现线程安全。ThreadLocal 是 Java 中的一种机制,用于在多个线程中实现变量的隔离。 在上面的代码中...

    Java中ThreadLocal源码详细注释

    线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突...

    java事务 - threadlocal

    Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...

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

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

    java 简单的ThreadLocal示例

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

    Java 中ThreadLocal类详解

    Java中的ThreadLocal类是一个强大的工具,它允许程序员创建线程局部变量。这意味着每个线程都有其自己独立的、不可见的变量副本,从而避免了线程间的数据共享问题,简化了多线程环境下的编程复杂性。ThreadLocal并不...

    实例详解Java中ThreadLocal内存泄露

    在Java编程中,ThreadLocal是一个强大的工具,它允许线程拥有自己的局部变量副本,从而避免了多线程环境下的数据共享问题。然而,如果不正确地使用ThreadLocal,可能会导致内存泄露,尤其是在Java EE容器如Tomcat中...

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

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

    快速了解Java中ThreadLocal类

    总之,ThreadLocal是Java中一种强大的工具,它可以提供线程安全的局部变量,帮助开发者在多线程编程中简化数据管理,同时避免了不必要的同步开销。但使用时需要注意内存泄漏问题,确保及时清理不再使用的ThreadLocal...

    彻底理解Java中的ThreadLocal

    彻底理解Java中的ThreadLocal ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。使用这个工具类可以很简洁地编写出优美的多线程程序。ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这...

    Java ThreadLocal详解_动力节点Java学院整理

    ThreadLocal是Java中的一种机制,可以将变量与线程关联起来,使得每个线程都可以拥有自己的变量副本。 ThreadLocal的出现是为了解决多线程编程中的线程安全问题。 从本质上说,ThreadLocal是一种存储机制,它可以在...

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

    ThreadLocal是Java中用于线程局部变量的一个工具类,它的工作原理主要体现在如何在不同的线程之间隔离变量的副本,确保每个线程拥有自己的独立数据。这个设计模式在多线程编程中尤其有用,因为它避免了传统的同步...

    使用Java ThreadLocal.docx

    Java中的ThreadLocal是一个非常有用的工具类,它提供了一种线程局部变量的机制。线程局部变量(ThreadLocal)的特点是每个线程都有其独立的副本,这些副本之间互不干扰,即使它们共享同一个ThreadLocal实例。这使得...

    JAVA ThreadLocal类深入

    在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...

    java的ThreadLocal[整理].pdf

    ThreadLocal是Java中一个非常重要的线程局部变量工具类,它的设计目的是为了解决多线程环境下各个线程之间的数据隔离问题。通过ThreadLocal,每个线程都可以拥有自己独立的变量副本,避免了多线程间的数据冲突和同步...

Global site tag (gtag.js) - Google Analytics