`
zhtch_123
  • 浏览: 85206 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java ThreadLocal使用浅析

 
阅读更多

 

Java ThreadLocal使用浅析

 

 

JAVA API 文档里关于 ThreadLocal 的定义是:

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

这个类提供了一个线程本地的变量。这些变量在被共享访问的情况下在不同的线程里是独立的 ( 必须通过 get set 方法来访问 )

 

很显然该类提供了一个机制可以防止多线程访问带来的不安全机制。实际上就是在线程本地保存一个变量,而不是通过共享变量。这个就要看我们的使用场合了,如果我们确实需要共享的数据,那还是必须通过同步机制来保证数据的安全。如果有些情况希望不同的线程保存的变量各自分开,那用这个还是比较合适的。

ThreadLocal 这个类本身不是代表线程要访问的变量,这个类的成员变量才是。 JDK1.5 ThreadLocal 加了泛型功能,即是 ThreadLocal<T>, 这个泛型 T 即是要线程的本地变量。线程通过 ThreadLocal get set 方法去访问这个变量 T ThreadLocal 提供了一个机制,它能保证线程通过这个来访问它来访问类型为 T 的变量的时候是不同的拷贝。所以访问该变量必须通过 Threadlocal 这个类只提供了两个 public 方法,即是 get() set ()方法来访问。

同时还提供了一个 inintValue() protected 方法。该方法用来初始化变量值。

注意默认情况下 initValue(), 返回 null 。线程在没有调用 set 之前,第一次调用 get 的时候, get 方法会默认去调用 initValue 这个方法。所以如果没有覆写这个方法,可能导致 get 返回的是 null 。当然如果调用过 set 就不会有这种情况了。但是往往在多线程情况下我们不能保证每个线程的在调用 get 之前都调用了 set ,所以最好对 initValue 进行覆写,以免导致空指针异常。

说了这么多,估计还不如看下例子吧,下面还是上例子。

例子 1 :没有使用 Threadlocal 的情况:

/**

*

* @author yblin

* 2009.8.18

*

*/

public class TestWithNoThreadLocal {

public static int a = 0;


public static void main(String[] args) {

MyThread myThread = new MyThread();

myThread.start();

for ( int i = 0; i < 5; i++) {

a = a + 1;

System. out .println(Thread. currentThread ().getName() + ":" + a );

}

}

public static class MyThread extends Thread {

public void run() {

for ( int i = 0; i < 5; i++) {

a = a + 1;

System. out .println(Thread. currentThread ().getName() + ":" + a );

}

}

}


}


运行的一种结果如下:

main:2

Thread-0:2

main:3

Thread-0:4

main:5

Thread-0:6

main:7

Thread-0:8

main:9

Thread-0:10


在没有同步的机制下,该结果有不安全的情况发生是正常的,两个线程都得到 2 。下面请看用了 ThreadLocal 的效果。


例子 2 :使用了 Threadlocal 的情况:

/**

*

* @author yblin

* 2009.8.18

*

*/

public class TestThreadLocal2 {

private static ThreadLocal<Integer> a = new ThreadLocal<Integer>() {

public Integer initialValue() { // 初始化,默认是返回 null

return 0;

}

};


public static void main(String args[]) {

MyThread my;

my = new MyThread();

my.start();

for ( int i = 0; i < 5; i++) {

a .set( a .get() + 1);

System. out .println(Thread. currentThread ().getName() + ":" + a .get());

}

}


public static class MyThread extends Thread {

public void run() {

for ( int i = 0; i < 5; i++) {

a .set( a .get() + 1);

System. out .println(Thread. currentThread ().getName() + ":"

+ a .get());

}

}

}

}


运行的一种结果如下:

main:1

Thread-0:1

main:2

Thread-0:2

main:3

Thread-0:3

main:4

Thread-0:4

Thread-0:5

main:5


如上是关于 ThreadLocal 的简单介绍。其内部具体实现可看其类实现。

 

分享到:
评论

相关推荐

    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多线程编程中的一个强大工具,但使用时需谨慎,理解其工作原理和潜在风险,才能更好地利用它来解决实际问题。

    java ThreadLocal使用案例详解

    Java ThreadLocal使用案例详解 Java ThreadLocal是Java语言中的一种机制,用于为每个线程提供一个独立的变量副本,以解决多线程环境下共享变量的线程安全问题。在本文中,我们将详细介绍Java ThreadLocal的使用案例...

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

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

    java中ThreadLocal详解

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

    java中ThreadLocal类的使用

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

    使用Java ThreadLocal.docx

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

    JAVA ThreadLocal类深入

    【JAVA ThreadLocal类深入】 Java中的ThreadLocal类是一种线程绑定机制,用于在多线程环境中为每个线程提供独立的变量副本,避免了线程间的数据共享带来的并发访问问题。ThreadLocal并不是一个线程对象,而是线程...

    java事务 - threadlocal

    当Java事务与ThreadLocal结合使用时,可以在不同的线程中维护各自的事务状态,比如在Spring框架中,每个线程的ThreadLocal可以存储一个TransactionStatus对象,这样就可以在线程内部管理当前事务的状态,而不会影响...

    ThreadLocal应用示例及理解

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

    Java ThreadLocal类应用实战案例分析

    Java ThreadLocal类应用实战案例分析 Java ThreadLocal类是Java语言中的一种线程局部变量机制,允许每个线程都拥有自己的变量副本,从而避免了多线程之间的变量冲突。在本文中,我们将通过实战案例分析Java ...

    java 中ThreadLocal 的正确用法

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

    Java源码解析ThreadLocal及使用场景

    Java源码解析ThreadLocal及使用场景 ThreadLocal是Java中一个非常重要的类,它在多线程环境下经常使用,用于提供线程本地变量。这些变量使每个线程都有自己的一份拷贝,使得多个线程可以独立地使用变量,不会彼此...

    Java ThreadLocal用法实例详解

    Java ThreadLocal用法实例详解 Java ThreadLocal是Java中的一种线程局部变量机制,用于保存每个线程独有的数据,以避免线程之间的数据共享问题。ThreadLocal的基本使用非常简单,只需要定义一个ThreadLocal变量,...

    Spring定时任务中使用ThreadLocal的坑

    NULL 博文链接:https://bijian1013.iteye.com/blog/2380233

    Java单线程ThreadLocal串值问题解决方案

    Java单线程ThreadLocal串值问题解决方案 Java单线程ThreadLocal串值问题解决方案主要介绍了Java单线程ThreadLocal串值问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

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

    理解ThreadLocal的工作原理以及如何正确使用它是Java并发编程的关键。 首先,ThreadLocal类的主要作用是为每个线程创建一个单独的变量副本。这意味着在同一个ThreadLocal变量中,不同的线程可以存储各自独立的值,...

    彻底理解Java 中的ThreadLocal

    总的来说,ThreadLocal是Java并发编程中的一种实用工具,它可以避免使用同步机制(如`synchronized`关键字)来保证线程安全,简化了多线程环境下的编程模型。然而,需要注意的是,如果不再使用ThreadLocal变量,应...

    Java资料-详解ThreadLocal

    `ThreadLocal`的全称是`java.lang.ThreadLocal`,它并不是一个线程,而是一个线程局部变量的容器。`ThreadLocal`的工作原理是为每个线程创建一个单独的实例副本,这些副本存储在一个与线程相关的映射表中。当线程...

Global site tag (gtag.js) - Google Analytics