`
free_flurry
  • 浏览: 3626 次
  • 性别: Icon_minigender_1
  • 来自: 福州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ThreadLocal是依赖于线程的!

阅读更多
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的分配空间啦
0
0
分享到:
评论

相关推荐

    ThreadLocal的几种误区

    因为ThreadLocal使得原本可以独立运行的类变得依赖于线程环境,这限制了它们在没有ThreadLocal场景下的应用。因此,ThreadLocal应当谨慎使用,仅在确实需要线程隔离且其他同步手段无法满足需求时才考虑。 ...

    Java中ThreadLocal的设计与使用

    这使得ThreadLocal适合于存储线程私有数据,如数据库连接、用户会话信息等。 ### ThreadLocal的最佳实践 1. **避免过度使用**:虽然ThreadLocal方便,但过度依赖可能导致设计复杂,不易维护。应优先考虑其他同步...

    ThreadLocal原理及在多层架构中的应用

    - **线程生命周期**:ThreadLocal变量仅存在于创建它的线程中,当线程结束执行时,其对应的ThreadLocalMap也会被清理。 ### 2. ThreadLocal的应用场景 ThreadLocal常用于以下场景: - **线程安全的配置对象**:在...

    ThreadLocal

    因此,如果在使用线程池时依赖ThreadLocal,需要特别处理线程退出或清理ThreadLocal。 总的来说,ThreadLocal是Java多线程编程中一个强大的工具,它简化了数据在多线程环境下的管理,同时也降低了线程安全的复杂性...

    彻底理解ThreadLocal 1

    ThreadLocal的实现主要依赖于`Thread`类中的一个名为`ThreadLocalMap`的内部类。`ThreadLocal.set()`方法首先获取当前线程的`ThreadLocalMap`实例,如果不存在,则创建一个新的`ThreadLocalMap`。然后将变量的值存储...

    JAVA并发-自问自答学ThreadLocal.pdf

    在Java的并发编程中,ThreadLocal是一个非常重要的概念,它可以帮助我们创建独立于线程的变量副本,避免了在多线程共享数据时可能出现的竞态条件。 1. **ThreadLocal的工作原理**: - 每个ThreadLocal实例都会为每...

    线程教程!!详细的线程操作

    10. **线程局部存储**:`ThreadLocal&lt;T&gt;`类允许你创建每个线程都有的独立副本的变量,这对于线程安全的数据存储很有用。 以上只是线程操作的一部分知识,深入理解和熟练应用这些概念是开发高效并发程序的关键。通过...

    18 线程作用域内共享变量—深入解析ThreadLocal.pdf

    `ThreadLocal`的`get`和`set`方法实际上依赖于`Thread`类中的一个`ThreadLocalMap`。当我们调用`set`方法时,`ThreadLocal`会将值存储在当前线程的`ThreadLocalMap`中,键为`ThreadLocal`实例本身,值为我们设置的...

    8个案例详解教会你ThreadLocal.docx

    例如,Spring 中的 TransactionTemplate 和 AOP 模块利用 `ThreadLocal` 存储当前事务信息,Hibernate 中的 Session 管理也依赖于 `ThreadLocal` 来保持线程绑定的 Session。 7. **线程安全** - `ThreadLocal` ...

    多线程线程变量赋值

    本话题聚焦于“多线程线程变量赋值”,讨论如何在不通过参数传递的情况下,为线程变量直接赋值。 首先,我们需要理解线程变量(Thread Local Variables)的概念。线程变量,也称为线程局部变量,是一种特殊类型的...

    Java中的线程同步与ThreadLocal无锁化线程封闭实现

    总结起来,Java中的线程同步主要依赖synchronized关键字,它可以保证代码块的原子性和可见性,防止数据竞争。而ThreadLocal则提供了一种线程安全的局部变量,通过为每个线程提供独立的变量副本,减少了对线程同步的...

    ThreadLocal分析

    ThreadLocalMap是一个特定于线程的哈希表,它的键是ThreadLocal实例,值是存储的变量。每当我们在ThreadLocal中set一个值时,实际上是将这个值存入当前线程的ThreadLocalMap中。 垃圾回收与ThreadLocal的关系是其...

    InheritableThreadLocal & ThreadLocal

    在Java编程中,线程局部变量(ThreadLocal)和可继承线程局部变量(InheritableThreadLocal)是两种非常重要的工具,它们允许我们在多线程环境中创建独立于线程的局部变量,确保每个线程拥有自己的变量副本,避免了...

    java 中ThreadLocal本地线程和同步机制的比较

    ThreadLocal的实现依赖于每个线程内部的一个ThreadLocalMap,这个Map存储了线程局部变量的副本。当调用`get()`或`set()`时,ThreadLocal会操作当前线程的ThreadLocalMap。例如,当调用`get()`时,如果变量尚未初始化...

    40道常问的Java多线程面试题!.zip

    理论上,优先级高的线程更可能获得CPU执行,但实际调度依赖于操作系统的策略。 8. **sleep()和wait()有什么区别?** sleep()使当前线程暂停指定时间,不释放锁;wait()让线程进入等待状态,释放持有的锁。 9. **...

    入研究java.lang.ThreadLocal类.docx

    多数应用不需要使用此方法,它们依赖于 initialValue() 方法来初始化 ThreadLocal 变量的值。 **示例代码**: ```java threadLocal.set("New Value"); ``` #### 三、典型实例 ##### 1. Hibernate 的 Session 工具...

Global site tag (gtag.js) - Google Analytics