import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadLocalTest {
private static Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
/**
* 开启两个线程,
* 第一个线程数据共享
* 第二个线程数据共享
* @param args
*/
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);
threadData.put(Thread.currentThread(), data);
threadLocal.set(data);
MyThreadScopeData.getInstance().setName("name"+data);
MyThreadScopeData.getInstance().setAge(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A {
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println("A1 " + Thread.currentThread().getName()
+ " has put data :" + data);
int data2 = threadLocal.get();
System.out.println("A2 " + Thread.currentThread().getName()
+ " has put data :" + data2);
MyThreadScopeData myThreadScopeData = MyThreadScopeData.getInstance();
System.out.println("A3 " + Thread.currentThread().getName()
+ " name :" + myThreadScopeData.getName() +" , age :" + myThreadScopeData.getAge() );
}
}
static class B {
public void get() {
int data = threadData.get(Thread.currentThread());
System.out.println("B " + Thread.currentThread().getName()
+ " has put data :" + data);
int data2 = threadLocal.get();
System.out.println("B2 " + Thread.currentThread().getName()
+ " has put data :" + data2);
MyThreadScopeData myThreadScopeData = MyThreadScopeData.getInstance();
System.out.println("B3 " + Thread.currentThread().getName()
+ " name :" + myThreadScopeData.getName() +" , age :" + myThreadScopeData.getAge() );
}
}
}
class MyThreadScopeData{
/*//饱汉模式
private MyThreadScopeData(){}
public static MyThreadScopeData getInstance(){
return myThreadScopeData;
}
private static MyThreadScopeData myThreadScopeData= new MyThreadScopeData();*/
/*//恶汉模式
private MyThreadScopeData(){}
public static synchronized MyThreadScopeData getInstance(){
if(myThreadScopeData==null)
myThreadScopeData = new MyThreadScopeData();
return myThreadScopeData;
}
private static MyThreadScopeData myThreadScopeData = null;*/
private MyThreadScopeData(){}
public static synchronized MyThreadScopeData getInstance(){
MyThreadScopeData instance = myThreadScopeData.get();
if(instance==null){
instance = new MyThreadScopeData();
myThreadScopeData.set(instance);
}
return instance;
}
private static ThreadLocal<MyThreadScopeData> myThreadScopeData = 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-0 has put data :-412573948
Thread-1 has put data :-589943191
A1 Thread-1 has put data :-589943191
A1 Thread-0 has put data :-412573948
A2 Thread-1 has put data :-589943191
A2 Thread-0 has put data :-412573948
A3 Thread-1 name :name-589943191 , age :-589943191
A3 Thread-0 name :name-412573948 , age :-412573948
B Thread-1 has put data :-589943191
B Thread-0 has put data :-412573948
B2 Thread-1 has put data :-589943191
B2 Thread-0 has put data :-412573948
B3 Thread-1 name :name-589943191 , age :-589943191
B3 Thread-0 name :name-412573948 , age :-412573948
分享到:
相关推荐
资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统...06ThreadLocal类及应用技巧【】06ThreadLocal类及应 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
ThreadLocal类及应用技巧 - `ThreadLocal`类提供了一种线程局部变量的解决方案,可以为每个线程提供独立的变量副本。 ##### 7. 多个线程之间共享数据的方式探讨 - 可以通过显式锁、同步容器等手段来实现多个线程间...
### ThreadLocal详解:Java多线程中的线程局部变量 #### 重要概念解析:ThreadLocal在Java多线程中的角色 ...理解并掌握ThreadLocal的工作原理和使用技巧,对于Java开发者而言,是提高多线程编程水平的关键步骤之一。
具体包括使用 WeakReference 和 SoftReference 管理对象引用、利用 Cleaner 进行资源清理、监控引用链、使用内存分析工具、检查集合类、清理 ThreadLocal 和静态引用、监控 JVM 内存使用、检测对象生命周期以及进行...
4. 线程安全:了解并发编程中的volatile、Atomic类和ThreadLocal。 六、网络编程 1. Socket通信:理解TCP和UDP协议,以及Socket和ServerSocket类的使用。 2. HTTP协议:了解HTTP的基本原理,能实现简单的HTTP客户端...
ThreadTest.zip文件显然包含了关于Java多线程API的详细讲解和实例代码,重点关注了Thread类、ThreadLocal类以及Executors类。 首先,让我们深入理解Thread类。它是Java中代表独立执行线程的基本类。每个线程都有...
- 高亮个人在Java开发中的专长,如JVM优化、多线程、设计模式或框架应用等。 2. **个性优点**: - 候选人应分享他们认为有助于Java开发的优点,例如良好的逻辑思维、代码整洁性、团队合作精神、自我学习能力等。 ...
3. **并发编程**:理解线程、同步、锁机制,如synchronized、volatile、ThreadLocal,以及并发工具类如Semaphore、CountDownLatch等。 4. **异常处理**:了解异常分类,如何正确抛出和捕获异常,以及何时使用try-...
`ThreadLocal`类及应用技巧 - **功能**:提供线程局部变量,每个线程拥有独立的变量副本,避免了线程间的共享数据冲突。 - **应用**:适用于需要在线程间隔离数据的场景,例如数据库连接、用户会话等。 ##### 5. ...
5. **集合框架**:JAVA的集合框架包括List、Set、Map等接口及其实现类,理解它们的特性和应用场景,如ArrayList与LinkedList的区别,HashMap与ConcurrentHashMap的并发处理,以及如何使用泛型来提高代码安全性。...
`ThreadLocal`类则提供了一种方式,让每个线程都有其独立的变量副本,避免了线程间的共享状态问题。 总的来说,Java多线程编程是构建高性能、响应快速的应用程序的关键技术,理解并掌握其原理和实践技巧对于Java...
- ThreadLocal原理及应用场景 - 并发工具类:CountDownLatch、CyclicBarrier、Semaphore等 5. **Java IO/NIO** - 字节流、字符流的使用 - 文件操作 - 缓冲区、转换流 - NIO(New IO)的介绍,包括Channel、...
以下是一些基于给定内容的Java程序性能优化技巧: 1. **合理分配对象空间**: - 在创建对象时,了解并预估对象的大小非常重要。例如,当我们使用`Vector`时,默认构造函数会分配10个元素的空间。如果预先知道`...
7. **反射**:掌握Class类的使用,动态创建对象,获取和修改私有属性及方法。 8. **设计模式**:熟悉并能灵活运用单例、工厂、观察者、装饰器、代理等常见设计模式。 9. **JVM**:理解Java虚拟机的工作原理,包括...
Java提供了强大的多线程支持,面试中可能会涉及到线程的创建、同步、互斥、死锁等问题,以及ThreadLocal、volatile、synchronized、wait/notify等关键字的理解与应用。 四、JVM内存模型 深入理解JVM的工作原理,...
理解并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)的使用,线程安全问题及解决方案,以及synchronized、volatile、ThreadLocal等关键字的用法。 5. **设计模式**:熟悉常见的23种设计模式,如工厂模式、...
- **并发编程**:了解线程的创建、同步机制,熟悉synchronized、volatile、ThreadLocal等概念。 - **集合框架**:深入理解List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashMap、TreeMap等的内部工作...
### Java核心API需要掌握的程度 Java作为一种广泛应用的编程语言,其强大的功能很大程度上依赖于其...总之,Java核心API的学习是一个逐步深入的过程,从基本的类库到高级的应用技巧都需要不断积累经验才能真正掌握。
6. **并发编程的应用**:压缩包中的并发编程_应用.pdf可能包含了一些实际场景下如何运用线程同步的知识,比如在数据库操作、网络请求、高并发服务器设计等方面的应用。 7. **内存泄漏与弱引用**:在JUC-ThreadLocal...