`
sungang_1120
  • 浏览: 322491 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

ThreadLocal类及应用技巧; 实现线程范围内数据共享

阅读更多
public class ThreadTest6 {
	
	private static ThreadLocal<Integer> currentLocalThread = new ThreadLocal<Integer>();
	private static ThreadLocal<MyThreadScopeData> myThreadScopeData = new ThreadLocal<MyThreadScopeData>();
	public static void main(String[] args) {
		for (int i = 0; i < 2; i++) {
			new Thread(
					new Runnable() {
						@Override
						public void run() {
							int data = new Random().nextInt();
							System.out.println(Thread.currentThread().getName()+ " has put data : " + data);
							
							currentLocalThread.set(data);
							//获取与本线程相关的实例
							MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
							myData.setName("name" + data);
							myData.setAge(data);
							
							//存入当前线程中
							myThreadScopeData.set(myData);
							
							new A().get();
							new B().get();
						}
					}
			).start();
		}
	}


	static class A{
		public void get(){
			//int data = localThreadMap.get(Thread.currentThread());
			int data = currentLocalThread.get();
			System.out.println("A from  " + Thread.currentThread().getName() + " get data :" + data);
			//获取与本线程相关的实例
			//MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			//从当前线程中获取
			MyThreadScopeData myData = myThreadScopeData.get();
			System.out.println("A from  " + Thread.currentThread().getName()
					+ " getName :" + myData.getName() 
					+ " , getAge : " + myData.getAge());
		}
	}
	static class B{
		public void get(){
			//int data = localThreadMap.get(Thread.currentThread());
			int data = currentLocalThread.get();
			System.out.println("B from  " + Thread.currentThread().getName() + " get data :" + data);
			//获取与本线程相关的实例
			//MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			//从当前线程中获取
			MyThreadScopeData myData = myThreadScopeData.get();
			System.out.println("B from  " + Thread.currentThread().getName()
					+ " getName :" + myData.getName() 
					+ " , getAge : " + myData.getAge());
		}
	}
}
class MyThreadScopeData{
	
	private MyThreadScopeData(){}
	
	/**
	 * 单例
	 * @return
	 */
	public static /*synchronized*/ MyThreadScopeData getThreadInstance(){
		MyThreadScopeData instance = map.get();
		if (null == instance) {
			instance = new MyThreadScopeData();
			map.set(instance);
		}
		
		return instance;
	}
	
	private static ThreadLocal<MyThreadScopeData> map = new ThreadLocal<MyThreadScopeData>();
	
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

 

 

打印结果:

Thread-1 has put data : -1091157391

Thread-0 has put data : -1297198387

A from  Thread-1 get data :-1091157391

A from  Thread-1 getName :name-1091157391 , getAge : -1091157391

A from  Thread-0 get data :-1297198387

A from  Thread-0 getName :name-1297198387 , getAge : -1297198387

B from  Thread-0 get data :-1297198387

B from  Thread-0 getName :name-1297198387 , getAge : -1297198387

B from  Thread-1 get data :-1091157391

B from  Thread-1 getName :name-1091157391 , getAge : -1091157391

 

分享到:
评论

相关推荐

    Java多线程编程之ThreadLocal线程范围内的共享变量

    Java中的ThreadLocal是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...

    ThreadLocal和事务

    使用ThreadLocal来管理数据库连接,可以确保每个请求的生命周期内,连接只被该请求使用,避免了线程间的数据共享问题,提高了安全性。 接着,我们谈谈`c3p0`数据源。c3p0是一个开源的JDBC连接池,它实现了数据源和...

    张孝祥Java多线程与并发库高级应用笔记

    `ThreadLocal`类及应用技巧 - **功能**:提供线程局部变量,每个线程拥有独立的变量副本,避免了线程间的共享数据冲突。 - **应用**:适用于需要在线程间隔离数据的场景,例如数据库连接、用户会话等。 ##### 5. ...

    Spring事务处理-ThreadLocal的使用

    这样,Spring可以在事务范围内正确地传播事务,即使在多线程环境下也能保证事务的正确性。 在Spring的`PlatformTransactionManager`接口中,`TransactionStatus`对象通常会用ThreadLocal来存储。当开始一个事务时,...

    经典Java多线程与并发库高级应用

    除了上述提到的技术点,本教程还会涉及到ThreadLocal类、线程范围内共享变量、多个线程之间共享数据的方式、java5原子性操作类的应用、Callable与Future的应用、线程锁技术、读写锁技术等内容。这些技术点都旨在帮助...

    JDK5中的多线程并发库.doc

    在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全...而线程范围内的数据共享,如`ThreadLocal`,则常用于存储线程局部变量,保证了各个线程之间的数据隔离,避免了不必要的同步开销。

    基于Java实现的多线程与线程安全实践-基于Http协议的断点续传.zip

    服务器接收到这个请求后,只会发送指定范围内的数据,这样就可以实现断点续传。 在Java中,我们可以使用HttpURLConnection或者HttpClient库来发送带有Range头的HTTP请求。例如,当下载中断时,记录下已下载的文件...

    JDK5中的多线程并发库

    5. **线程范围内共享数据**: - **应用场景**:比如银行转账,转入和转出需要共享数据。 - **解决方案**:可以使用自定义`Map`以`Thread`对象为Key保存数据,或者使用`ThreadLocal`,它为每个线程维护独立的变量...

    Java多线程同步问题的探究.pdf

    在Web应用和框架中,ThreadLocal被广泛用来存储请求范围内的数据。 在讨论Java多线程同步问题时,JVM的作用也不可忽视。JVM负责管理和调度Java程序中的线程,包括线程的创建、运行、同步、通信以及销毁。JVM中的...

    Servlet线程安全的解决方法

    通过为每个线程提供自己的变量副本,可以有效地避免线程之间的数据共享问题。 ```java public class MyServlet extends HttpServlet { private ThreadLocal&lt;String&gt; threadLocal = new ThreadLocal(); protected...

    Java多线程编程总结

    - 线程总是隶属于某个进程,同一进程内的多个线程共享内存空间。 2. **Java中的线程** - 在Java中,“线程”有两层含义: - `java.lang.Thread` 类的一个实例。 - 线程的执行过程。 - 使用 `java.lang.Thread`...

    Java多线程与线程安全实践-基于Http协议的断点续传

    4. **线程局部变量**:`ThreadLocal`类提供了一种线程内的局部变量,每个线程都拥有自己的一份独立副本,互不影响。 5. **volatile关键字**:它用于标记一个变量,使得多个线程可以共享这个变量,且能保证可见性和...

    Android多线程全新讲解.pdf

    另外,`ThreadLocal`类提供了一种线程范围内的局部变量,它为每个线程都维护了一个独立的变量副本,确保了数据的安全性。 在Android中,多线程通常用于执行耗时操作,如网络请求、数据库操作等,以保证UI线程的流畅...

    《Java2面向对象程序设计基础》线程.ppt

    线程是进程中的执行实体,多个线程可以在同一进程中并发执行,共享内存空间和数据。线程间的通信和资源共享使得多线程编程复杂但也强大。 6.1.2 线程的生命周期 线程有五个基本状态:新建、就绪、运行、阻塞和消亡...

    java线程同步

    Java线程同步是多线程编程中的一个重要概念,它用于解决在并发环境下多个线程对共享资源的访问问题,以防止数据的不一致性。在Java中,线程同步的机制主要包括锁、同步块、同步方法、volatile关键字以及线程通信(如...

    java线程.part001

    - ThreadLocal:为每个线程创建一个独立的变量副本,避免了线程间的共享和同步问题。 4. **线程优先级** Java中的线程有不同的优先级,范围从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY...

    多线程与多核编程文档

    - **线程局部变量**:ThreadLocal为每个线程提供独立的变量副本,避免了线程间的数据共享问题。 7. **案例分析**: - **Web服务器**:多线程处理客户端请求,提高服务器响应速度。 - **大数据处理**:利用多核...

    struts1,struts2,webwork,线程安全问题

    - 对于必须保留的状态,可以考虑使用请求范围内的属性来保存,比如通过`HttpServletRequest`的属性方法来实现。 #### 二、Struts2与线程安全问题 Struts2框架设计时充分考虑了线程安全问题,主要体现在其默认使用...

    java线程安全总结.doc

    4. **线程局部变量**:每个线程都有自己的副本,不会造成数据冲突,如`ThreadLocal`类。 ### 三、线程安全策略 1. **同步机制**:包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`java.util....

    谈谈Java中的ThreadLocal

    通过ThreadLocal可以将对象的可见范围限制在同一个线程内。  跳出误区  需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了...

Global site tag (gtag.js) - Google Analytics