`
Ydoing
  • 浏览: 106197 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java并发编程之ThreadLocal类详解

 
阅读更多
ThreadLocal类可以理解为ThreadLocalVariable(线程局部变量)提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回当前执行线程在调用set时设置的最新值。可以将ThreadLocal<T>视为包含了Map<Thread,T>对象,保存了特定于该线程的值。

概括起来说,对于多线程资源共享的问题,同步机制采用了以时间换空间的方式,而ThreadLocal采用了以空间换时间的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

模拟ThreadLocal

    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    public class SimpleThreadLocal<T> {
    private Map<Thread, T> valueMap = Collections
    .synchronizedMap(new HashMap<Thread, T>());
    public void set(T newValue) {
    valueMap.put(Thread.currentThread(), newValue); // ①键为线程对象,值为本线程的变量副本
    }
    public T get() {
    Thread currentThread = Thread.currentThread();
    T o = valueMap.get(currentThread); // ②返回本线程对应的变量
    if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起来。
    o = initialValue();
    valueMap.put(currentThread, o);
    }
    return o;
    }
    public void remove() {
    valueMap.remove(Thread.currentThread());
    }
    protected T initialValue() {
    return null;
    }
    }
实用ThreadLocal

    class Count {
    private SimpleThreadLocal<Integer> count = new SimpleThreadLocal<Integer>() {
    @Override
    protected Integer initialValue() {
    return 0;
    }
    };
    public Integer increase() {
    count.set(count.get() + 1);
    return count.get();
    }
    }
    class TestThread implements Runnable {
    private Count count;
    public TestThread(Count count) {
    this.count = count;
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    for (int i = 1; i <= 3; i++) {
    System.out.println(Thread.currentThread().getName() + "\t" + i
    + "th\t" + count.increase());
    }
    }
    }
    public class TestThreadLocal {
    public static void main(String[] args) {
    Count count = new Count();
    Thread t1 = new Thread(new TestThread(count));
    Thread t2 = new Thread(new TestThread(count));
    Thread t3 = new Thread(new TestThread(count));
    Thread t4 = new Thread(new TestThread(count));
    t1.start();
    t2.start();
    t3.start();
    t4.start();
    }
    }
输出
Thread-01th1
Thread-02th2
Thread-03th3
Thread-31th1
Thread-11th1
Thread-12th2
Thread-21th1
Thread-13th3
Thread-32th2
Thread-33th3
Thread-22th2
Thread-23th3

分享到:
评论

相关推荐

    Java 并发编程之ThreadLocal详解及实例

    在并发编程中,ThreadLocal 提供了一种线程间数据隔离的解决方案,避免了传统共享变量带来的同步问题。下面将详细探讨 ThreadLocal 的工作原理、使用方法以及适用场景。 1. **ThreadLocal 工作原理** - 每个 `...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java并发编程:设计原则与模式(第二版).rar

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的著作。本书旨在帮助开发者理解和掌握在Java环境中进行高效并发处理的关键技术与设计模式。以下是对该书内容的一些核心知识...

    Java并发编程原理与实战

    并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析.mp4 提前完成任务之FutureTask...

    JAVA并发编程实战JAVA并发编程实战JAVA并发编程实战JAVA并发编程实战

    《Nginx高性能Web服务器详解》可能是与Java并发编程实战相关的补充阅读,因为Nginx作为一个高性能的反向代理服务器,经常与Java应用服务器配合使用,优化Web服务的并发处理能力。Nginx的异步非阻塞I/O模型和事件驱动...

    java虚拟机并发编程

    为了更好地理解Java并发编程的实际应用,我们可以考虑一个简单的例子——使用`Future`和`Callable`来实现异步任务的执行。假设有一个复杂的计算任务需要长时间执行,但主程序不能等待这个任务完成。此时,可以将计算...

    java并发编程实践笔记

    ### Java并发编程实践笔记知识点详解 #### 一、保证线程安全的方法 1. **不要跨线程访问共享变量:** 当多个线程共享某个变量时,若其中一个线程修改了该变量,其他线程若没有正确同步,则可能读取到错误的数据。...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    java高并发编程推荐超好的一本电子书

    Java提供了原子操作类,用于支持无锁并发编程,可以避免使用锁带来的性能开销。常用的原子操作类包括: - `AtomicInteger`:原子更新整型的类。 - `AtomicLong`:原子更新长整型的类。 - `AtomicReference`:原子...

    Java 中ThreadLocal类详解

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

    龙果java并发编程完整视频

    第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节...

    Java 并发编程原理与实战视频

    java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...

    java 并发编程 多线程

    ### Java并发编程与多线程知识点详解 #### 1. 线程安全与锁定机制 - **确保线程安全**: 在Java并发编程中,确保线程安全是至关重要的。通常有三种方法来实现这一点: - 使用`synchronized`关键字:这是最基本的...

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    并发编程(各种脑图资源集合).rar

    通过这些脑图,学习者可以从宏观和微观两个层面理解并发编程,不仅能够掌握Java并发编程的基础知识,还能深入理解JVM内存模型和高级并发技术。每个脑图都是一张知识地图,引领学习者逐步探索并发编程的世界,虽然初...

    java并发编程

    第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节并发工具类Exchanger详解00:13:47分钟 | 第41节...

    ThreadLocal详解

    ### ThreadLocal详解:Java多线程中的线程局部变量 #### 重要概念解析:ThreadLocal在Java多线程中的角色 ThreadLocal是Java语言中处理多线程编程中线程安全问题的一种有效策略,它首次出现在JDK1.2版本中。与传统...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    Java并发编程:ThreadLocal、Java内存模型、锁、并发工具类、线程池等;JVM(Java虚拟机):Java内存管理详解、垃圾回收机制、垃圾回收器等;MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用...

Global site tag (gtag.js) - Google Analytics