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);
}
}
相关推荐
4. **减少锁的使用**: 当多个线程需要共享同一资源,但每个线程只需要读取自己相关的数据时,`ThreadLocal`可以避免锁的使用,提升效率。 **注意事项** - 使用`ThreadLocal`后,应确保及时清理不再使用的变量,...
Java ThreadLocal类应用实战案例分析 Java ThreadLocal类是Java语言中的一种线程局部变量机制,允许每个线程都拥有自己的变量副本,从而避免了多线程之间的变量冲突。在本文中,我们将通过实战案例分析Java ...
第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...
ThreadLocal 使用及实现原理.mp4 并发工具类CountDownLatch详解.mp4 并发工具类CyclicBarrier 详解.mp4 并发工具类Semaphore详解.mp4 并发工具类Exchanger详解.mp4 CountDownLatch,CyclicBarrier,Semaphore源码解析....
第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...
- **生产者消费者模式**:使用`BlockingQueue`实现线程间的协同工作。 - **单例模式**:考虑多线程环境下的线程安全单例实现,如双重检查锁定。 - **读写锁**:`ReentrantReadWriteLock`提供读写分离的锁机制,...
8. **线程局部变量**:理解ThreadLocal的工作原理和应用场景,以及它如何为每个线程提供独立的变量副本。 9. **并发编程的最佳实践**:学习如何避免死锁、活锁和饥饿,以及如何有效地进行资源分配和线程调度。 10....
- **多线程**:线程的创建、同步、协作,死锁、活锁的概念,以及ThreadLocal的使用。 - **反射**:如何在运行时获取类的信息,动态创建对象,调用私有方法等。 - **注解(Annotation)**:自定义注解的创建和使用...
Java提供了各种手段来实现线程安全,如synchronized关键字、volatile变量、ThreadLocal等。 3. **并发控制**:Java提供了多种并发控制工具,包括synchronized、wait()、notify()、notifyAll()、ReentrantLock(可重...
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并发编程实战》是Java并发编程领域的一本经典之作,由Brian Goetz等作者撰写。这本书深入浅出地介绍了Java并发编程的各种概念和技术,帮助开发者理解和掌握如何在多线程环境中编写高效、安全的代码。jcip-...
10. **线程局部变量(ThreadLocal)**:为每个线程提供独立的变量副本,确保线程间的隔离,避免了共享状态带来的问题。 实战部分将通过具体的代码示例展示如何创建和管理线程,如何实现线程同步,以及如何利用...
使用 ThreadLocal 保存用户状态,通过拦截器拦截请求,根据自定义注解判断用户登录状态 使用 Ajax 异步发帖、发送私信、评论 使用 Redis 实现点赞、关注功能,优化登录模块——存储登录凭证、缓存用户信息 【备注】 ...
垃圾收集机制是Java内存管理的一大特色,它自动回收不再使用的对象所占用的内存,避免了程序员手动管理内存的繁琐。了解垃圾收集的工作原理和各种垃圾收集器,如Serial、Parallel、CMS和G1,对于优化程序性能至关...
《Java并发编程实战》这本书是Java开发者深入理解并发编程的重要参考资料。并发编程是现代软件开发中的核心技能之一,尤其是在多核处理器和分布式系统环境中,它的重要性不言而喻。本书详细探讨了Java平台上的并发...
5. **线程局部变量改进**:`ThreadLocal`类在Java 7中得到优化,更方便地处理线程局部变量,这在多线程环境中的数据隔离问题上非常有用。 6. **异常处理**:在并发编程中,正确处理异常是至关重要的。Java 7对异常...
3. **线程启动与停止**:使用`Thread.Start()`启动线程,而`Thread.Abort()`可以终止线程,但不推荐使用,因为这可能导致资源泄露和异常。通常,通过共享标志或中断请求来优雅地停止线程。 4. **线程同步与互斥**:...
第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...
第36节ThreadLocal 使用及实现原理00:17:41分钟 | 第37节并发工具类CountDownLatch详解00:22:04分钟 | 第38节并发工具类CyclicBarrier 详解00:11:52分钟 | 第39节并发工具类Semaphore详解00:17:27分钟 | 第40节...