`

JavaThread-ThreadLocal笔记

阅读更多
1.ThreadLocal简介
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.
最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等.

2.部分源码
ThreadLocal中存在ThreadLocalMap 以不同的线程key创建不同的副本。如下ThreadLocal set() /get()方法
    public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                return (T)e.value;
        }
        return setInitialValue();
    }

3.代码实例
/**
 * Created by wuhao on 15-12-23.
 */
public class ThreadLocalDemo {

    public static void main(String[] args) {

        ThreadStringSeq tss = new ThreadStringSeq();
        tss.setState("first");
        //切换state
        ThreadStringClient ts1 = new ThreadStringClient(tss);
        ThreadStringClient ts2 = new ThreadStringClient(tss);
        new Thread(ts1).start();
        new Thread(ts2).start();

        ThreadLocalSeq tls = new ThreadLocalSeq();
        System.out.println("Main:" + Thread.currentThread().getName() + " sn:" + tls.getNextState());
        //切换state
        ThreadLocalClient tl1 = new ThreadLocalClient(tls);
        ThreadLocalClient tl2 = new ThreadLocalClient(tls);
        new Thread(tl1).start();
        new Thread(tl2).start();

    }
}
class ThreadLocalSeq {
    //通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
    private static ThreadLocal<String> state = new ThreadLocal<String>() {
        public String initialValue() {
            return "";
        }
    };
    //获取下一个序列值
    public String getNextState() {
        state.set(state.get() + "-->|");
        return state.get();
    }
    public void setState(String st){
        state.set(st);
    }

}

class ThreadStringSeq {
    //通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
    private static String state = "";
    //获取下一个序列值
    public String getNextState() {
        state = state + "-->|";
        return state;
    }
    public void setState(String st){
        state = st;
    }

}


class ThreadLocalClient implements Runnable {
    private ThreadLocalSeq sn;
    public ThreadLocalClient(ThreadLocalSeq sn) {
        super();
        this.sn = sn;
    }
    public void run() {
        for (int i = 0; i < 3; i++) {
            //获取线程状态
            System.out.println("ThreadLocalClient:" + Thread.currentThread().getName() + " sn:" + sn.getNextState());
        }
    }
}

class ThreadStringClient implements Runnable {
    private ThreadStringSeq sn;
    public ThreadStringClient(ThreadStringSeq sn) {
        super();
        this.sn = sn;
    }
    public void run() {
        for (int i = 0; i < 3; i++) {
            //获取线程状态
            System.out.println("ThreadStringClient:" + Thread.currentThread().getName() + " sn:" + sn.getNextState());
        }
    }
}
分享到:
评论

相关推荐

    Java并发编程学习笔记.rar

    Java中的线程可以通过继承`Thread`类或实现`Runnable`接口来创建。 2. **线程同步**:为了解决多个线程间的竞态条件,Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(包括`ReentrantLock`)以及`...

    java源码笔记

    Java源码笔记主要涵盖的是Java编程语言的核心概念和高级特性,特别是与网络编程相关的部分。在深入理解Java源码的过程中,我们不仅可以了解到语言的基础结构,还能探索其在网络通信中的应用。下面将对Java源码和网络...

    Java并发编程学习笔记

    - 线程封闭(Thread Confinement):一种确保线程安全的策略,通常通过ThreadLocal等机制实现。 - 不可变对象(Immutable Objects):一旦创建就不能被修改的对象,天然线程安全。 学习Java并发编程,重点在于理解...

    Java JDK6学习笔记[ppt]

    Java多线程编程是重要部分,JDK6提供了Thread类和Runnable接口,以及synchronized关键字、volatile变量和ThreadLocal等并发工具,帮助开发者构建高效、安全的并发程序。 总之,这份Java JDK6学习笔记将带你全面了解...

    java多线程学习笔记

    - **ThreadLocal**:每个线程都有自己独立的副本,互不干扰,避免了线程安全问题。 8. **线程池** - **ExecutorService**:线程池接口,提供创建、管理和关闭线程池的方法。 - **Executors**:静态工厂方法,...

    Java多线程源码笔记.pdf

    在Java中,实现多线程主要有两种方式:通过继承Thread类和实现Runnable接口。Thread类提供了创建新线程的基本功能,而Runnable接口则允许你在不修改类继承关系的情况下实现多线程。 1. Thread类解析:Thread类是...

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

    java线程学习笔记

    Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...

    java8源码-ac_babel:一些后端学习笔记整理

    java8 源码 设计模式 java 并发 public class Foo { // SimpleDateFormat is not thread-safe, so give one to each thread private static final ThreadLocal formatter = new ThreadLocal(){ @Override protected ...

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...

    java加强笔记

    ### Java加强笔记知识点详解 #### 一、JDK1.5的新特性 ##### 1. 自动装箱与拆箱 - **自动装箱**:指的是将基本数据类型自动转换成对应的包装类对象。 - 例如:`int i = 1; Integer j = i;` - **自动拆箱**:则是...

    java中的多线程笔记

    在 Java 中,`Thread` 类提供了中断相关的两个方法: 1. `interrupt()`:用于设置线程的中断标志位,如果线程正在阻塞(如等待 I/O 或调用 `sleep()`、`wait()` 等),则会抛出 `InterruptedException`,使线程从...

    day020-继承加强和设计模式代码和笔记.rar

    1、ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); //获取当前线程类加载器 2、InputStream is = classLoader.getResourceAsStream("文件路径/文件名");//通过当前线程的类...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....

    Java并发编程(学习笔记).xmind

    ThreadLocal类 只读共享:不变对象一定是线程安全的 尽量将域声明为final类型,除非它们必须是可变的 分类 不可变对象 事实不可变对象 线程安全共享 封装有助于管理复杂度 线程...

    java并发学习笔记

    以上就是Java并发学习笔记的主要内容,这些知识点构成了Java并发编程的基础,理解和掌握它们对于编写高效、稳定的多线程程序至关重要。在实际开发中,需要结合具体场景灵活运用,确保程序的正确性和性能。

Global site tag (gtag.js) - Google Analytics