import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.io.*;
public class Test1 implements Runnable{
static ThreadLocal<Integer> t=new ThreadLocal<Integer>(){
@Override
protected synchronized Integer initialValue(){
return new Integer(0);
}
};
static int count=0;
final int id=count++;
public Test1(){
t.set((Integer)id);//这个执行了嘛?
System.out.println("Constructor:"+id);
}
public void run(){
t.set(t.get()+1);
System.out.println(t.get());
}
public static void main(String[] args){
ExecutorService exec=Executors.newCachedThreadPool();
for (int i=0;i<5;i++)
exec.execute(new Test1());
exec.shutdownNow();
}
}
ThreadLocal是依赖于线程的,会为每个线程分配独立的空间,即使A线程上的X任务完成,如果A继续执行Y任务的话,这个分配出来的空间依旧存在并且延用。我做一些实验时候发现的可能会一不小心就出错的地方。
其输出为,
Constructor:0
Constructor:1
Constructor:2
Constructor:3
Constructor:4
1
1
1
1
1
t.set((Integer)id);这个放在构造器中,可能很直观认为,在run中输出为每个任务id+1;可是实际输出为1,即初始化ThreadLocal值以后并没有对t进行set操作。这就是因为,在构造Test1时候并没有为这个Test1的实例分配线程,所以自然不存在ThreadLocal的分配空间啦
分享到:
相关推荐
因为ThreadLocal使得原本可以独立运行的类变得依赖于线程环境,这限制了它们在没有ThreadLocal场景下的应用。因此,ThreadLocal应当谨慎使用,仅在确实需要线程隔离且其他同步手段无法满足需求时才考虑。 ...
这使得ThreadLocal适合于存储线程私有数据,如数据库连接、用户会话信息等。 ### ThreadLocal的最佳实践 1. **避免过度使用**:虽然ThreadLocal方便,但过度依赖可能导致设计复杂,不易维护。应优先考虑其他同步...
- **线程生命周期**:ThreadLocal变量仅存在于创建它的线程中,当线程结束执行时,其对应的ThreadLocalMap也会被清理。 ### 2. ThreadLocal的应用场景 ThreadLocal常用于以下场景: - **线程安全的配置对象**:在...
因此,如果在使用线程池时依赖ThreadLocal,需要特别处理线程退出或清理ThreadLocal。 总的来说,ThreadLocal是Java多线程编程中一个强大的工具,它简化了数据在多线程环境下的管理,同时也降低了线程安全的复杂性...
ThreadLocal的实现主要依赖于`Thread`类中的一个名为`ThreadLocalMap`的内部类。`ThreadLocal.set()`方法首先获取当前线程的`ThreadLocalMap`实例,如果不存在,则创建一个新的`ThreadLocalMap`。然后将变量的值存储...
在Java的并发编程中,ThreadLocal是一个非常重要的概念,它可以帮助我们创建独立于线程的变量副本,避免了在多线程共享数据时可能出现的竞态条件。 1. **ThreadLocal的工作原理**: - 每个ThreadLocal实例都会为每...
10. **线程局部存储**:`ThreadLocal<T>`类允许你创建每个线程都有的独立副本的变量,这对于线程安全的数据存储很有用。 以上只是线程操作的一部分知识,深入理解和熟练应用这些概念是开发高效并发程序的关键。通过...
`ThreadLocal`的`get`和`set`方法实际上依赖于`Thread`类中的一个`ThreadLocalMap`。当我们调用`set`方法时,`ThreadLocal`会将值存储在当前线程的`ThreadLocalMap`中,键为`ThreadLocal`实例本身,值为我们设置的...
例如,Spring 中的 TransactionTemplate 和 AOP 模块利用 `ThreadLocal` 存储当前事务信息,Hibernate 中的 Session 管理也依赖于 `ThreadLocal` 来保持线程绑定的 Session。 7. **线程安全** - `ThreadLocal` ...
本话题聚焦于“多线程线程变量赋值”,讨论如何在不通过参数传递的情况下,为线程变量直接赋值。 首先,我们需要理解线程变量(Thread Local Variables)的概念。线程变量,也称为线程局部变量,是一种特殊类型的...
总结起来,Java中的线程同步主要依赖synchronized关键字,它可以保证代码块的原子性和可见性,防止数据竞争。而ThreadLocal则提供了一种线程安全的局部变量,通过为每个线程提供独立的变量副本,减少了对线程同步的...
ThreadLocalMap是一个特定于线程的哈希表,它的键是ThreadLocal实例,值是存储的变量。每当我们在ThreadLocal中set一个值时,实际上是将这个值存入当前线程的ThreadLocalMap中。 垃圾回收与ThreadLocal的关系是其...
在Java编程中,线程局部变量(ThreadLocal)和可继承线程局部变量(InheritableThreadLocal)是两种非常重要的工具,它们允许我们在多线程环境中创建独立于线程的局部变量,确保每个线程拥有自己的变量副本,避免了...
ThreadLocal的实现依赖于每个线程内部的一个ThreadLocalMap,这个Map存储了线程局部变量的副本。当调用`get()`或`set()`时,ThreadLocal会操作当前线程的ThreadLocalMap。例如,当调用`get()`时,如果变量尚未初始化...
理论上,优先级高的线程更可能获得CPU执行,但实际调度依赖于操作系统的策略。 8. **sleep()和wait()有什么区别?** sleep()使当前线程暂停指定时间,不释放锁;wait()让线程进入等待状态,释放持有的锁。 9. **...
多数应用不需要使用此方法,它们依赖于 initialValue() 方法来初始化 ThreadLocal 变量的值。 **示例代码**: ```java threadLocal.set("New Value"); ``` #### 三、典型实例 ##### 1. Hibernate 的 Session 工具...