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

ThreadLocal实例

 
阅读更多
ThreadLocal基于线程的数据存储结构。ThreadLocal是类型于Map的一种数据结构,它以当前线程的ThreadLocal为key,来实现当前线程范围内的局部变量对象的共享。其保存和获取的方法是set(Object)和get()。
应用实例:
/**
 * <br>
 * do what you want to do and never stop it.
 * <br>
 */
package com.luch.thread;

import java.util.Random;

/**
 * @author Jack
 * Jul 7, 2014
 * <br>
 */
public class ThreadScopeShareData {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		for(int i =0; i < 2; i++) {
		new Thread(new Runnable(){
			public void run() {
				int data = new Random().nextInt();
				System.out.println(Thread.currentThread().getName() + " has put count:" +data);
				MyThreadScopeData.getInstance().setName("name"+data);
				System.out.println(Thread.currentThread().getName() +" MyThreadScopeData: " + MyThreadScopeData.getInstance());
				new A().get();
				new B().get();
			}
			
		}).start();
		}
	}
	
	static class A{
		public void get(){
			System.out.println("A " + Thread.currentThread().getName() + " Singlton: " + MyThreadScopeData.getInstance());
			System.out.println("A " + Thread.currentThread().getName() + " has get count:" +MyThreadScopeData.getInstance().getName());
		}
	}
	
	static class B{
		public void get(){
			System.out.println("B " + Thread.currentThread().getName() + " Singlton: "+MyThreadScopeData.getInstance());
			System.out.println("B " + Thread.currentThread().getName() + " has get count:" +MyThreadScopeData.getInstance().getName());
		}
	}
	
	
	static class MyThreadScopeData{
		private String name;
		private int age;
		private MyThreadScopeData(){}
	    //private static volatile MyThreadScopeData instance;
		
		public static /*synchronized*/ MyThreadScopeData getInstance(){
			MyThreadScopeData instance = map.get();
			if (instance == null) {
				instance = new MyThreadScopeData();
				map.set(instance);
			}
			return instance;
		}
		public static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
		
		public String getName() {
			System.out.println("getName:" + Thread.currentThread().getName() + " name=" + name + " this.name=" + this.name + " " + this.toString());
			return name;
		}
		public synchronized  void setName(String name) {
			this.name = name;
			System.out.println("setName:" + Thread.currentThread().getName() + " name=" + name + " this.name=" + this.name + " " + this.toString());
		}
		public int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age = age;
		}
	}

}

此实例就通过ThreadLocal这个对象来达到MyThreadScopeData 实例对象在当前线程范围内(这里是Module A和Module B)共享同一个对象。并且通过单例的模式,很好的屏蔽了ThreadLocal对外部模块的可见性。


Set(T)的源代码如下:
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
}

把要保存的对象保存到ThreadLocalMap这个对象中,并且以ThreadLocal本身作为key,如果此Map一开始不存在,就去初始化一个Map,然后保存值Value。
分享到:
评论

相关推荐

    java 中ThreadLocal实例分析

    "Java 中ThreadLocal实例分析" Java 中的 ThreadLocal 实例分析是指在多线程环境下,如何使用 ThreadLocal 来实现线程安全。ThreadLocal 是 Java 中的一种机制,用于在多个线程中实现变量的隔离。 在上面的代码中...

    事务的封装和Threadlocal实例

    当多个线程并发执行时,每个线程都可以安全地使用自己的`Connection`实例,而不会相互干扰。 总的来说,结合JDBC的事务管理和ThreadLocal,我们可以在多线程环境中更好地实现数据库操作,确保数据的一致性,并提高...

    ThreadLocal应用示例及理解

    创建ThreadLocal实例时,通常会定义一个泛型参数,代表该线程局部变量的类型。例如: ```java ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal(); ``` ### 设置和获取值 在ThreadLocal中,`set()`方法用于...

    ThreadLocal

    当我们创建一个新的ThreadLocal实例时,它并不会立即分配内存,而是等到线程第一次调用`set`或`get`方法时才会为该线程创建一个副本。这个副本存储在线程的ThreadLocalMap中,这个Map是由Thread类维护的,键是...

    JDK的ThreadLocal理解(一)使用和测试

    通过创建ThreadLocal实例,我们可以为每个线程提供一个独立的变量副本,这些副本在各个线程之间互不影响,从而实现线程局部变量的功能。本文将深入探讨ThreadLocal的使用、原理以及一些实际应用中的测试案例。 ### ...

    ThreadLocal的用处

    由于ThreadLocalMap使用弱引用保存键(即ThreadLocal实例),当ThreadLocal变量不再被引用时,垃圾收集器可以回收ThreadLocal实例。但是,如果ThreadLocalMap中的值(通常是对象)仍然被其他强引用保持,那么即使...

    深入理解 Java 之 ThreadLocal 工作原理1

    ThreadLocalMap的实现使用了弱引用(WeakReference&lt;ThreadLocal&lt;?&gt;&gt;)作为key,这是因为即使没有外部引用指向ThreadLocal实例,只要它还在ThreadLocalMap中作为key存在,垃圾收集器就不会回收ThreadLocal实例。...

    java 简单的ThreadLocal示例

    1. **创建ThreadLocal实例:** 首先,你需要创建一个ThreadLocal类型的实例,这将作为你在每个线程中存储值的容器。 ```java ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal(); ``` 2. **设置线程局部变量的...

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

    - ThreadLocalMap使用弱引用作为键,这意味着如果线程不再引用ThreadLocal实例,即使ThreadLocal实例仍然存在,但只要没有其他引用,那么在垃圾收集时,ThreadLocal实例会被清除,相应的ThreadLocalMap中的条目也会...

    day18 10.使用ThreadLocal来解决问题

    每个线程都有自己的ThreadLocalMap,当创建新的ThreadLocal实例时,如果没有为当前线程创建过这个映射表,那么就会为当前线程创建一个。ThreadLocal通过get()和set()方法访问或设置线程局部变量,这些操作会直接作用...

    Java中ThreadLocal的设计与使用

    每个线程都有自己的ThreadLocal实例,它们各自保存独立的变量副本,互不影响。ThreadLocal的主要优点在于避免了线程之间的数据共享,减少了同步的需求,从而提高了程序的性能和可读性。 ### ThreadLocal的使用方法 ...

    threadlocal.rar

    ThreadLocal的工作原理可以这样理解:每个ThreadLocal实例都会为每个线程创建一个单独的存储空间,也就是说,当多个线程访问同一个ThreadLocal实例时,每个线程都有自己独立的副本,互不干扰。ThreadLocal并不提供...

    java事务 - threadlocal

    ThreadLocal的使用方法是创建一个ThreadLocal实例,然后通过其set()方法设置线程局部变量,get()方法获取当前线程的该变量值。需要注意的是,ThreadLocal不是线程安全的,它只是保证了线程内部的隔离性,但不负责...

    ThreadLocal_ThreadLocal源码分析_

    在ThreadLocal中,每个实例都有一个内部Map,这个Map存储了键值对,键是ThreadLocal实例,值就是线程本地的变量副本。在JDK 8之前,这个内部Map是`ThreadLocal.ThreadLocalMap`,而从JDK 8开始,改为了`...

    从ThreadLocal的使用到Spring的事务管理

    每个线程都有自己的ThreadLocal实例,并且只能访问自己的副本,不会与其他线程的数据产生冲突,从而实现了线程间的隔离。使用ThreadLocal可以避免在多线程环境下频繁的同步操作,提高程序的效率。例如,在Web应用...

    threadLocal

    ThreadLocal的使用方法通常是创建一个ThreadLocal实例,然后在需要的地方通过它的`set()`方法设置线程局部变量的值,通过`get()`方法获取该变量的副本。在生命周期结束后,通常需要调用`remove()`方法清除线程的副本...

    简单分析Java线程编程中ThreadLocal类的使用共

    1. **创建ThreadLocal实例**:首先,你需要创建一个ThreadLocal实例,这是你将要存储线程局部变量的地方。例如: ```java ThreadLocal&lt;String&gt; threadLocalVar = new ThreadLocal(); ``` 2. **设置线程局部值**...

    正确理解ThreadLocal

    每个线程都拥有自己的ThreadLocal实例,存储在这个实例中的变量只对当前线程可见,其他线程无法访问。 2. **作用**:ThreadLocal主要用在多线程环境下,为每个线程提供独立的、线程私有的变量副本,避免了线程间的...

Global site tag (gtag.js) - Google Analytics