`
huangyongxing310
  • 浏览: 499122 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java ThreadLocal例子

    博客分类:
  • Java
阅读更多
java ThreadLocal例子


ThreadLocal就是用于每个线程拥有自己的一份变量,线程之间是不同的对象


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;


public class ThreadLocalTest {

//	private static ThreadLocalTestModel threadLocalTestModel;
//
//	static {
//		System.out.println("threadLocalTestModel");
//		threadLocalTestModel = new ThreadLocalTestModel();
//		threadLocalTestModel.setTest("AAA");
//	}

	// ①通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值
	private static ThreadLocal<ThreadLocalTestModel> seqNum = new ThreadLocal<ThreadLocalTestModel>() {
		public ThreadLocalTestModel initialValue() {
			ThreadLocalTestModel threadLocalTestModel = new ThreadLocalTestModel();
			threadLocalTestModel.setTest("AAA");
			return threadLocalTestModel;
		}
	};

	// ②获取下一个序列值
	public ThreadLocalTestModel getNextNum() {
		ThreadLocalTestModel threadLocalTestModel = seqNum.get();

//		ThreadLocalTestModel threadLocalTestModel2 = new ThreadLocalTestModel();
//		threadLocalTestModel2.setTest("BBB");
		seqNum.set(threadLocalTestModel);
		return threadLocalTestModel;
	}

	public static void main(String[] args) {
		ThreadLocalTest sn = new ThreadLocalTest();
		// ③ 3个线程共享sn,各自产生序列号
		TestClient t1 = new TestClient(sn);
		TestClient t2 = new TestClient(sn);
		TestClient t3 = new TestClient(sn);
		t1.start();
		t2.start();
		t3.start();
	}

	private static class TestClient extends Thread {
		private ThreadLocalTest sn;

		public TestClient(ThreadLocalTest sn) {
			this.sn = sn;
		}

		public void run() {
			for (int i = 0; i < 3; i++) {
				ThreadLocalTestModel threadLocalTestModel = sn.getNextNum();

				if(threadLocalTestModel!=null){

					// ④每个线程打出3个序列值
					System.out.println("thread[" + Thread.currentThread().getName() + "] --> sn[" + threadLocalTestModel.toString() + "] ,hashCode == " + threadLocalTestModel.hashCode());
					threadLocalTestModel.setTest("ccC");
				}
			}
		}
	}
}




private static ThreadLocal<HttpServletRequest> reqLocal = new ThreadLocal<HttpServletRequest>();
	private static ThreadLocal<HttpServletResponse> responseLocal = new ThreadLocal<HttpServletResponse>();
	public static void setHttpServletRequest(HttpServletRequest request) {
		reqLocal.set(request);
	}
	public static void clearHttpReqResponse() {
		reqLocal.remove();
		responseLocal.remove();
	}
	public static HttpServletRequest getHttpServletRequest() {
		return reqLocal.get();
	}
}



参考:http://www.cnblogs.com/dreamroute/p/5034726.html
参考:http://blog.csdn.net/lufeng20/article/details/24314381

https://www.cnblogs.com/dolphin0520/p/3920407.html(Java并发编程:深入剖析ThreadLocal)

https://blog.csdn.net/chen_kkw/article/details/79176371(深入解析 ThreadLocal 和 ThreadLocalMap)
分享到:
评论

相关推荐

    ThreadLocal应用示例及理解

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...

    JAVA ThreadLocal类深入

    在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...

    使用Java ThreadLocal.docx

    在这个例子中,`MyRunnable`类中的`threadLocal`变量被两个不同的线程(`thread1`和`thread2`)使用。尽管它们共享同一个Runnable实例,但每个线程都会有自己的ThreadLocal副本,因此它们的`threadLocal`变量持有...

    Java资料-详解ThreadLocal

    `ThreadLocal`的全称是`java.lang.ThreadLocal`,它并不是一个线程,而是一个线程局部变量的容器。`ThreadLocal`的工作原理是为每个线程创建一个单独的实例副本,这些副本存储在一个与线程相关的映射表中。当线程...

    彻底理解Java 中的ThreadLocal

    在这个例子中,`seqNum`是一个ThreadLocal实例,它的`initialValue()`方法返回0,表示序列号的初始值。`getNextNum()`方法会获取当前线程的序列号副本,增加1后再保存回去,这样每个线程都会拥有自己独立的序列号...

    Java多线程编程中ThreadLocal类的用法及深入

    早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...

    java的ThreadLocal[整理].pdf

    ThreadLocal是Java中一个非常重要的线程局部变量工具类,它的设计目的是为了解决多线程环境下各个线程之间的数据隔离问题。通过ThreadLocal,每个线程都可以拥有自己独立的变量副本,避免了多线程间的数据冲突和同步...

    Java多线程 之 临界区、ThreadLocal.docx

    在这个例子中,`ThreadLocalTest`类中的`threadLocal`变量为每个线程初始化一个随机值,并且`increament()`方法会增加当前线程的`ThreadLocal`变量的值。由于每个线程都有自己的副本,因此不会发生数据竞争。 总结...

    实例讲解Java并发编程之ThreadLocal类

    Java并发编程中的ThreadLocal类是一个非常重要的工具,它允许我们在多线程环境下为每个线程维护独立的变量副本,从而避免了线程间的数据共享和同步问题。ThreadLocal并不是一个线程,而是一个线程局部变量的容器。...

    Java 中ThreadLocal类详解

    Java中的ThreadLocal类是一个强大的工具,它允许程序员创建线程局部变量。这意味着每个线程都有其自己独立的、不可见的变量副本,从而避免了线程间的数据共享问题,简化了多线程环境下的编程复杂性。ThreadLocal并不...

    java线程例子大全

    本资源“java线程例子大全”包含了十八个单元的实例代码,覆盖了Java线程操作的多个方面。 1. **线程创建** - 继承`Thread`类:创建一个新的类,该类继承自`Thread`,然后重写`run()`方法。实例化后调用`start()`...

    事务的封装和Threadlocal实例

    ThreadLocal是Java提供的一种线程局部变量,它为每个线程创建并维护一个独立的变量副本,使得每个线程只能访问自己内部的变量,互不干扰。在多线程环境下,ThreadLocal能帮助我们避免共享状态的并发问题,提升程序的...

    ThreadLocal源码分析和使用

    ThreadLocal 是 Java 语言中的一种多线程编程机制,用于解决多线程程序的并发问题。它不是一个 Thread,而是一个 Thread 的局部变量。ThreadLocal 的出现是为了解决多线程程序中的共享变量问题。当多个线程访问同一...

    Java并发编实践之ThreadLocal变量.doc

    在这个例子中,`SequenceNumber`类有一个`ThreadLocal&lt;Integer&gt;`成员变量`seqNum`,并重写了`initialValue()`方法初始化为0。`getNextNum()`方法用于获取并递增序列号。`TestClient`线程类会打印出各自线程的序列号...

    java常用词语例子以及解释

    ### Java常用词汇与数据库操作详解 在Java编程中,掌握一系列关键术语对于理解和编写高效、安全的代码至关重要。本文将深入解析几个常见的Java词汇及其在数据库操作中的应用实例,帮助开发者提升技能,优化代码。 ...

    Java 并发编程之ThreadLocal详解及实例

    在这个例子中,`UniqueThreadIdGenerator` 类使用 `ThreadLocal` 来为每个线程生成唯一的 ID。`initialValue()` 方法会在每个线程首次访问 `uniqueNum` 时被调用,返回一个递增的 ID。 5. **注意事项** - 虽然 `...

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

    在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...

    实例详解Java中ThreadLocal内存泄露

    在我们的例子中,`ThreadLocal`的引用破坏了这些条件,所以必须手动断开引用。 总之,理解`ThreadLocal`的工作原理和`WebappClassLoader`的角色对于防止内存泄漏至关重要。在使用`ThreadLocal`时,一定要确保在恰当...

    java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解.pdf

    在Java中,有多种方式可以实现线程间的数据共享和对象独立,其中ThreadLocal是常用的工具之一。 在多线程环境下,共享数据通常会引发线程安全问题,比如上述例子中的“张三给李四转钱”场景,如果两个线程同时操作...

    理解threadlocal

    `ThreadLocal`是一个非常有用的类,它在Java 1.2版本中被引入到`java.lang`包中。其主要功能是在多线程环境中为每个线程提供独立的变量副本,从而避免了线程之间的数据竞争和同步问题。`ThreadLocal`并不是线程本身...

Global site tag (gtag.js) - Google Analytics