`
123003473
  • 浏览: 1060283 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java.lang.ThreadLocal类的用法,及与同步机制的比较

    博客分类:
  • java
 
阅读更多
一、ThreadLocal类

     ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。

    举例:

1、类SeriaNum类为每一个线程创建一个唯一的序列号,在线程生命周期内不变。

public class SerialNum {
    // The next serial number to be assigned
    private static int nextSerialNum = 0;

    @SuppressWarnings("unchecked")
private static ThreadLocal serialNum = new ThreadLocal() {
        protected synchronized Object initialValue() {
            return new Integer(nextSerialNum++);
        }
    };

    public static int get() {
        return ((Integer) (serialNum.get())).intValue();
    }
}


2、测试

public class thred extends Thread{
private int num;
public void run(){ 
   num=SerialNum.get();
   System.out.println(SerialNum.get());
}
public static void main(String[] args) {
   thred a=new thred();
   thred b=new thred();
   thred c=new thred();
   thred d=new thred();
   thred e=new thred();
   thred f=new thred();
   thred g=new thred();
   a.start();
   b.start();
   c.start();
   d.start();
   e.start();
   f.start();
   g.start();
   try {
    sleep(10000);
   } catch (InterruptedException e1) {
    e1.printStackTrace();
   }
   System.out.println(b.num);
}
}

输出:

0
1
2
3
4
5
6
结论:可以看书abcdefg六个线程的序列号确定了后,不在变化。



二、 ThreadLocal与其它同步机制的比较

   ThreadLocal和其它同步机制相比有什么优势呢?ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。

       由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。
分享到:
评论

相关推荐

    入研究java.lang.ThreadLocal类.docx

    ### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...

    java.lang包介绍

    在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...

    java-lang包详解

    在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地导入`java.lang`。 1....

    threadlocal:java.lang.ThreadLocal 的实验性无等待并发实现

    【标题】:“线程本地(ThreadLocal):Java.lang.ThreadLocal 的实验性无等待并发实现” 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它提供了线程局部变量的功能。线程局部变量是局限于单个线程的变量,...

    threadlocal.rar

    ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中一个非常重要的工具类,它主要用于在多线程环境中提供线程局部变量。ThreadLocal不是用来解决线程安全问题的,而是为每个线程创建独立的变量副本,确保线程间...

    ThreadLocal

    ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中用于处理线程局部变量的一个类。它的设计目标是为每个线程提供一个独立的变量副本,使得这些副本只对当前线程可见,从而实现了线程之间的数据隔离。...

    Java API原生文档

    3. **多线程**:Java API支持多线程编程,`java.lang.Thread`类和`java.util.concurrent`包提供了丰富的线程控制和同步机制,如`synchronized`关键字、`ThreadLocal`、`ExecutorService`等。 4. **网络编程**:`...

    java 1.8 API 中文版

    6. **反射**:`java.lang.reflect`包提供了反射机制,允许在运行时检查类、接口、构造器和方法的信息,并能够动态调用方法和访问字段。 7. **国际化**:`java.text`和`java.util.Locale`支持全球化和本地化,提供...

    java多线程编程总结

    如果是实现了 `java.lang.Runnable` 接口的类,则需要使用 `Thread` 的构造方法: ```java Thread(Runnable target) Thread(Runnable target, String name) Thread(ThreadGroup group, Runnable target) ...

    Java多线程编程总结

    - 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。 - 每个Java应用从main()方法开始运行,该方法运行在主线程中。 - 创建新线程时,会产生一个新的调用栈。 - 线程可分为...

    javathread.part05.rar

    Java线程是多任务编程中的核心概念,尤其在Java中,理解并掌握线程...解压后,你可以深入学习线程的调度策略、线程局部变量(`ThreadLocal`)、线程优先级以及其他并发工具类的使用,进一步提升你的Java并发编程能力。

    Java多线程

    Java中可以通过定义同步方法或使用同步块来实现线程同步。同步方法通过隐式锁定对象来防止多个线程同时访问,而同步块则可以更精确地控制同步范围。 #### 九、Java线程:并发协作-生产者消费者模型 生产者消费者...

    Java面试常问题目.pdf

    - Vector和Hashtable是同步的集合类,但因为性能问题,它们在现代Java编程中较少使用。 - Collections类提供了静态方法以返回同步的集合包装器。 10. Java泛型: - 泛型允许在编译时提供类型检查和类型安全,...

    JAVA_API_1.7中文.zip_API_java api 1.7 中文

    - **`java.lang.Thread`类**:代表一个执行线程,提供了线程的启动、同步和停止的方法。 - **`java.util.concurrent`包**:包含高级并发工具,如`ThreadLocal`用于线程局部变量,`ReentrantLock`可重入锁,以及`...

    Java中的线程同步与ThreadLocal无锁化线程封闭实现

    ThreadLocal,全称为`java.lang.ThreadLocal`,是Java提供的一种线程局部变量,它的每个线程都有自己的副本,线程间互不影响,从而实现无锁化线程封闭。ThreadLocal不是用来解决线程同步问题的,而是用来避免线程间...

    Java多线程运算集合

    - Java提供了多种同步机制来解决多线程并发访问同一资源时可能出现的问题,如同步方法、同步块等。 - 同步方法通过 `synchronized` 关键字修饰类的方法,同步块则通过对特定对象加锁实现。 - **锁机制**: - 锁...

    javathread.part104.rar

    5. **线程同步**:为了避免多个线程间的资源竞争,Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及`Lock`和`Condition`接口。 6. **死锁(Deadlock)**:当两个或...

    Java 多线程与并发编程总结.doc

    Java中的线程创建主要有两种方式:一是继承`java.lang.Thread`类并重写`run()`方法;二是实现`java.lang.Runnable`接口,提供`run()`方法实现,然后通过`Thread`类的构造函数传入Runnable对象来创建线程。这两种方式...

    Java核心API需要掌握的程度

    - 对于`java.lang`包下的所有类,应该熟悉每个类的作用以及如何使用它们的基本方法。 - 特别是`Object`、`String`、`Math`、`Thread`等类,应该深入理解它们的特性及应用场景。 - 对于集合框架、IO流、网络编程等...

Global site tag (gtag.js) - Google Analytics