`

实战十二:threadlocal 使用

 
阅读更多

 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本。我们自己就可以提供一个简单的实现版本

 

 

public class TestThreadLocal {

 

ThreadLocal<String> myLocal = new ThreadLocal<String>();

 

String myName;

 

public String getName() {

return myName;

}

 

public void setName(String name) {

myName = name;

}

 

public static void main(String[] args) throws InterruptedException {

TestThreadLocal ooo = new TestThreadLocal();

Thread[] threadArray = new Thread[10];

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

 

Thread thi = new Thread(new ThreadWithoutThreadLocal(ooo), "thread" + i);

threadArray[i] = thi;

}

 

for (Thread th : threadArray) {

th.start();

}

 

Thread.sleep(3000);

System.out.println("-----------------------------------------------------------------");

 

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

 

Thread thi = new Thread(new ThreadWithThreadLocal(ooo), "thread" + i);

threadArray[i] = thi;

}

 

for (Thread th : threadArray) {

th.start();

}

}

 

}

 

class ThreadWithoutThreadLocal implements Runnable {

public TestThreadLocal ooo;

 

public ThreadWithoutThreadLocal(TestThreadLocal o) {

ooo = o;

}

 

@Override

public void run() {

String localName = Thread.currentThread().getName();

ooo.setName(localName);

ooo.myLocal.set(localName);

// it will be mess up if multi thread running

// result like this

// ThreadName =======thread1 but it's actual name thread1

// ThreadName =======thread2 but it's actual name thread2

// ThreadName =======thread1 but it's actual name thread0

// ThreadName =======thread4 but it's actual name thread4

// ThreadName =======thread3 but it's actual name thread3

// ThreadName =======thread7 but it's actual name thread7

// ThreadName =======thread6 but it's actual name thread6

// ThreadName =======thread5 but it's actual name thread5

// ThreadName =======thread8 but it's actual name thread8

// ThreadName =======thread9 but it's actual name thread9

System.out.println(

"ThreadName =======" + ooo.getName() + " but it's actual name  " + Thread.currentThread().getName());

 

}

 

}

 

class ThreadWithThreadLocal implements Runnable {

public TestThreadLocal ooo;

 

public ThreadWithThreadLocal(TestThreadLocal o) {

ooo = o;

}

 

@Override

public void run() {

String localName = Thread.currentThread().getName();

ooo.myLocal.set(Thread.currentThread().getName());

 

// ThreadName======thread0 but it's actual name thread0

// ThreadName======thread2 but it's actual name thread2

// ThreadName======thread1 but it's actual name thread1

// ThreadName======thread3 but it's actual name thread3

// ThreadName======thread5 but it's actual name thread5

// ThreadName======thread4 but it's actual name thread4

// ThreadName======thread8 but it's actual name thread8

// ThreadName======thread6 but it's actual name thread6

// ThreadName======thread9 but it's actual name thread9

// ThreadName======thread7 but it's actual name thread7

 

System.out.println("ThreadName======" + ooo.myLocal.get() + " but it's actual name  " + localName);

 

}

 

 

}

分享到:
评论

相关推荐

    ThreadLocal简单Demo

    4. **减少锁的使用**: 当多个线程需要共享同一资源,但每个线程只需要读取自己相关的数据时,`ThreadLocal`可以避免锁的使用,提升效率。 **注意事项** - 使用`ThreadLocal`后,应确保及时清理不再使用的变量,...

    Java ThreadLocal类应用实战案例分析

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

    龙果 java并发编程原理实战

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    Java并发编程原理与实战

    ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....

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

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **生产者消费者模式**:使用`BlockingQueue`实现线程间的协同工作。 - **单例模式**:考虑多线程环境下的线程安全单例实现,如双重检查锁定。 - **读写锁**:`ReentrantReadWriteLock`提供读写分离的锁机制,...

    实战Java高并发程序设计模式视频

    8. **线程局部变量**:理解ThreadLocal的工作原理和应用场景,以及它如何为每个线程提供独立的变量副本。 9. **并发编程的最佳实践**:学习如何避免死锁、活锁和饥饿,以及如何有效地进行资源分配和线程调度。 10....

    疯狂Java实战演义光盘

    - **多线程**:线程的创建、同步、协作,死锁、活锁的概念,以及ThreadLocal的使用。 - **反射**:如何在运行时获取类的信息,动态创建对象,调用私有方法等。 - **注解(Annotation)**:自定义注解的创建和使用...

    java并发编程实战源码,java并发编程实战pdf,Java

    Java提供了各种手段来实现线程安全,如synchronized关键字、volatile变量、ThreadLocal等。 3. **并发控制**:Java提供了多种并发控制工具,包括synchronized、wait()、notify()、notifyAll()、ReentrantLock(可重...

    Java并发编程实战

    3.4.2 示例:使用Volatile类型来发布不可变对象 3.5 安全发布 3.5.1 不正确的发布:正确的对象被破坏 3.5.2 不可变对象与初始化安全性 3.5.3 安全发布的常用模式 3.5.4 事实不可变对象 3.5.5 可变对象 3.5.6 ...

    java并发编程实战源码-jcip-examples:java并发编程实战

    《Java并发编程实战》是Java并发编程领域的一本经典之作,由Brian Goetz等作者撰写。这本书深入浅出地介绍了Java并发编程的各种概念和技术,帮助开发者理解和掌握如何在多线程环境中编写高效、安全的代码。jcip-...

    java多线程的讲解和实战

    10. **线程局部变量(ThreadLocal)**:为每个线程提供独立的变量副本,确保线程间的隔离,避免了共享状态带来的问题。 实战部分将通过具体的代码示例展示如何创建和管理线程,如何实现线程同步,以及如何利用...

    基于SpringBoot+Mybatis+Redis开发的一个问答社区源码+sql数据库(仿牛客网).zip

    使用 ThreadLocal 保存用户状态,通过拦截器拦截请求,根据自定义注解判断用户登录状态 使用 Ajax 异步发帖、发送私信、评论 使用 Redis 实现点赞、关注功能,优化登录模块——存储登录凭证、缓存用户信息 【备注】 ...

    实战java虚拟机

    垃圾收集机制是Java内存管理的一大特色,它自动回收不再使用的对象所占用的内存,避免了程序员手动管理内存的繁琐。了解垃圾收集的工作原理和各种垃圾收集器,如Serial、Parallel、CMS和G1,对于优化程序性能至关...

    java并发变成实战

    《Java并发编程实战》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器和分布式系统环境中,它的重要性不言而喻。本书详细探讨了Java平台上的并发...

    《Java7并发编程实战手册》书中实例代码

    5. **线程局部变量改进**:`ThreadLocal`类在Java 7中得到优化,更方便地处理线程局部变量,这在多线程环境中的数据隔离问题上非常有用。 6. **异常处理**:在并发编程中,正确处理异常是至关重要的。Java 7对异常...

    C#多线程编程实战源码

    3. **线程启动与停止**:使用`Thread.Start()`启动线程,而`Thread.Abort()`可以终止线程,但不推荐使用,因为这可能导致资源泄露和异常。通常,通过共享标志或中断请求来优雅地停止线程。 4. **线程同步与互斥**:...

    龙果java并发编程完整视频

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

    java并发编程

    第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...

Global site tag (gtag.js) - Google Analytics