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是一种特殊类型的变量,它主要用于在多线程环境下提供线程范围内的局部变量。每个线程都拥有自己独立的ThreadLocal变量副本,互不影响。这与传统的全局变量不同,全局变量在所有线程间共享,可能...
使用ThreadLocal来管理数据库连接,可以确保每个请求的生命周期内,连接只被该请求使用,避免了线程间的数据共享问题,提高了安全性。 接着,我们谈谈`c3p0`数据源。c3p0是一个开源的JDBC连接池,它实现了数据源和...
`ThreadLocal`类及应用技巧 - **功能**:提供线程局部变量,每个线程拥有独立的变量副本,避免了线程间的共享数据冲突。 - **应用**:适用于需要在线程间隔离数据的场景,例如数据库连接、用户会话等。 ##### 5. ...
这样,Spring可以在事务范围内正确地传播事务,即使在多线程环境下也能保证事务的正确性。 在Spring的`PlatformTransactionManager`接口中,`TransactionStatus`对象通常会用ThreadLocal来存储。当开始一个事务时,...
除了上述提到的技术点,本教程还会涉及到ThreadLocal类、线程范围内共享变量、多个线程之间共享数据的方式、java5原子性操作类的应用、Callable与Future的应用、线程锁技术、读写锁技术等内容。这些技术点都旨在帮助...
在JDK5中,Java引入了一套强大的多线程并发库,极大地提升了多线程编程的效率和安全...而线程范围内的数据共享,如`ThreadLocal`,则常用于存储线程局部变量,保证了各个线程之间的数据隔离,避免了不必要的同步开销。
服务器接收到这个请求后,只会发送指定范围内的数据,这样就可以实现断点续传。 在Java中,我们可以使用HttpURLConnection或者HttpClient库来发送带有Range头的HTTP请求。例如,当下载中断时,记录下已下载的文件...
5. **线程范围内共享数据**: - **应用场景**:比如银行转账,转入和转出需要共享数据。 - **解决方案**:可以使用自定义`Map`以`Thread`对象为Key保存数据,或者使用`ThreadLocal`,它为每个线程维护独立的变量...
在Web应用和框架中,ThreadLocal被广泛用来存储请求范围内的数据。 在讨论Java多线程同步问题时,JVM的作用也不可忽视。JVM负责管理和调度Java程序中的线程,包括线程的创建、运行、同步、通信以及销毁。JVM中的...
通过为每个线程提供自己的变量副本,可以有效地避免线程之间的数据共享问题。 ```java public class MyServlet extends HttpServlet { private ThreadLocal<String> threadLocal = new ThreadLocal(); protected...
- 线程总是隶属于某个进程,同一进程内的多个线程共享内存空间。 2. **Java中的线程** - 在Java中,“线程”有两层含义: - `java.lang.Thread` 类的一个实例。 - 线程的执行过程。 - 使用 `java.lang.Thread`...
4. **线程局部变量**:`ThreadLocal`类提供了一种线程内的局部变量,每个线程都拥有自己的一份独立副本,互不影响。 5. **volatile关键字**:它用于标记一个变量,使得多个线程可以共享这个变量,且能保证可见性和...
另外,`ThreadLocal`类提供了一种线程范围内的局部变量,它为每个线程都维护了一个独立的变量副本,确保了数据的安全性。 在Android中,多线程通常用于执行耗时操作,如网络请求、数据库操作等,以保证UI线程的流畅...
线程是进程中的执行实体,多个线程可以在同一进程中并发执行,共享内存空间和数据。线程间的通信和资源共享使得多线程编程复杂但也强大。 6.1.2 线程的生命周期 线程有五个基本状态:新建、就绪、运行、阻塞和消亡...
Java线程同步是多线程编程中的一个重要概念,它用于解决在并发环境下多个线程对共享资源的访问问题,以防止数据的不一致性。在Java中,线程同步的机制主要包括锁、同步块、同步方法、volatile关键字以及线程通信(如...
- ThreadLocal:为每个线程创建一个独立的变量副本,避免了线程间的共享和同步问题。 4. **线程优先级** Java中的线程有不同的优先级,范围从MIN_PRIORITY(1)到MAX_PRIORITY(10),默认优先级是NORM_PRIORITY...
- **线程局部变量**:ThreadLocal为每个线程提供独立的变量副本,避免了线程间的数据共享问题。 7. **案例分析**: - **Web服务器**:多线程处理客户端请求,提高服务器响应速度。 - **大数据处理**:利用多核...
- 对于必须保留的状态,可以考虑使用请求范围内的属性来保存,比如通过`HttpServletRequest`的属性方法来实现。 #### 二、Struts2与线程安全问题 Struts2框架设计时充分考虑了线程安全问题,主要体现在其默认使用...
4. **线程局部变量**:每个线程都有自己的副本,不会造成数据冲突,如`ThreadLocal`类。 ### 三、线程安全策略 1. **同步机制**:包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`java.util....
通过ThreadLocal可以将对象的可见范围限制在同一个线程内。 跳出误区 需要重点强调的的是,不要拿ThreadLocal和synchronized做类比,因为这种比较压根是无意义的!sysnchronized是一种互斥同步机制,是为了...