`
xuweilovejava
  • 浏览: 8579 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal类及应用技巧

阅读更多
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集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统...06ThreadLocal类及应用技巧【】06ThreadLocal类及应 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    java加强笔记

    ThreadLocal类及应用技巧 - `ThreadLocal`类提供了一种线程局部变量的解决方案,可以为每个线程提供独立的变量副本。 ##### 7. 多个线程之间共享数据的方式探讨 - 可以通过显式锁、同步容器等手段来实现多个线程间...

    ThreadLocal详解

    ### ThreadLocal详解:Java多线程中的线程局部变量 #### 重要概念解析:ThreadLocal在Java多线程中的角色 ...理解并掌握ThreadLocal的工作原理和使用技巧,对于Java开发者而言,是提高多线程编程水平的关键步骤之一。

    java面试技巧及笔试汇集

    4. 线程安全:了解并发编程中的volatile、Atomic类和ThreadLocal。 六、网络编程 1. Socket通信:理解TCP和UDP协议,以及Socket和ServerSocket类的使用。 2. HTTP协议:了解HTTP的基本原理,能实现简单的HTTP客户端...

    ThreadTest.zip

    ThreadTest.zip文件显然包含了关于Java多线程API的详细讲解和实例代码,重点关注了Thread类、ThreadLocal类以及Executors类。 首先,让我们深入理解Thread类。它是Java中代表独立执行线程的基本类。每个线程都有...

    11个java面试题及面试技巧

    - 高亮个人在Java开发中的专长,如JVM优化、多线程、设计模式或框架应用等。 2. **个性优点**: - 候选人应分享他们认为有助于Java开发的优点,例如良好的逻辑思维、代码整洁性、团队合作精神、自我学习能力等。 ...

    Java常见面试题及解析电子书&Java;程序员面试技巧

    3. **并发编程**:理解线程、同步、锁机制,如synchronized、volatile、ThreadLocal,以及并发工具类如Semaphore、CountDownLatch等。 4. **异常处理**:了解异常分类,如何正确抛出和捕获异常,以及何时使用try-...

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

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

    JAVA编程技巧 原代码

    5. **集合框架**:JAVA的集合框架包括List、Set、Map等接口及其实现类,理解它们的特性和应用场景,如ArrayList与LinkedList的区别,HashMap与ConcurrentHashMap的并发处理,以及如何使用泛型来提高代码安全性。...

    Java多线程程序设计-JSP教程,Java技巧及代码

    `ThreadLocal`类则提供了一种方式,让每个线程都有其独立的变量副本,避免了线程间的共享状态问题。 总的来说,Java多线程编程是构建高性能、响应快速的应用程序的关键技术,理解并掌握其原理和实践技巧对于Java...

    笔试面试题国内知名公司

    - ThreadLocal原理及应用场景 - 并发工具类:CountDownLatch、CyclicBarrier、Semaphore等 5. **Java IO/NIO** - 字节流、字符流的使用 - 文件操作 - 缓冲区、转换流 - NIO(New IO)的介绍,包括Channel、...

    如何利用Java开发高性能、高并发Web应用

    以下是一些基于给定内容的Java程序性能优化技巧: 1. **合理分配对象空间**: - 在创建对象时,了解并预估对象的大小非常重要。例如,当我们使用`Vector`时,默认构造函数会分配10个元素的空间。如果预先知道`...

    最新java面试必备技巧资料

    7. **反射**:掌握Class类的使用,动态创建对象,获取和修改私有属性及方法。 8. **设计模式**:熟悉并能灵活运用单例、工厂、观察者、装饰器、代理等常见设计模式。 9. **JVM**:理解Java虚拟机的工作原理,包括...

    java程序员面试必备大全(包含丰富的面试题目和面试技巧).rar

    Java提供了强大的多线程支持,面试中可能会涉及到线程的创建、同步、互斥、死锁等问题,以及ThreadLocal、volatile、synchronized、wait/notify等关键字的理解与应用。 四、JVM内存模型 深入理解JVM的工作原理,...

    java面试技术和技巧.zip

    理解并发容器(如ConcurrentHashMap、CopyOnWriteArrayList)的使用,线程安全问题及解决方案,以及synchronized、volatile、ThreadLocal等关键字的用法。 5. **设计模式**:熟悉常见的23种设计模式,如工厂模式、...

    java程序员-面试技巧

    - **并发编程**:了解线程的创建、同步机制,熟悉synchronized、volatile、ThreadLocal等概念。 - **集合框架**:深入理解List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashMap、TreeMap等的内部工作...

    Java核心API需要掌握的程度

    ### Java核心API需要掌握的程度 Java作为一种广泛应用的编程语言,其强大的功能很大程度上依赖于其...总之,Java核心API的学习是一个逐步深入的过程,从基本的类库到高级的应用技巧都需要不断积累经验才能真正掌握。

    2 线程同步机制.md,学习代码

    6. **并发编程的应用**:压缩包中的并发编程_应用.pdf可能包含了一些实际场景下如何运用线程同步的知识,比如在数据库操作、网络请求、高并发服务器设计等方面的应用。 7. **内存泄漏与弱引用**:在JUC-ThreadLocal...

Global site tag (gtag.js) - Google Analytics