实例讲解Java并发编程之ThreadLocal类
时间:2021-04-02 09:47:09|栏目:JAVA代码|点击: 次
ThreadLocal类可以理解为ThreadLocalVariable(线程局部变量),提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回当前执行线程在调用set时设置的最新值。可以将ThreadLocal<T>视为 包含了Map<Thread,T>对象,保存了特定于该线程的值。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
模拟ThreadLocal
复制代码 代码如下:
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class SimpleThreadLocal<T> {
private Map<Thread, T> valueMap = Collections
.synchronizedMap(new HashMap<Thread, T>());
public void set(T newValue) {
valueMap.put(Thread.currentThread(), newValue); // ①键为线程对象,值为本线程的变量副本
}
public T get() {
Thread currentThread = Thread.currentThread();
T o = valueMap.get(currentThread); // ②返回本线程对应的变量
if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起来。
o = initialValue();
valueMap.put(currentThread, o);
}
return o;
}
public void remove() {
valueMap.remove(Thread.currentThread());
}
protected T initialValue() {
return null;
}
}
实用ThreadLocal
复制代码 代码如下:
class Count {
private SimpleThreadLocal<Integer> count = new SimpleThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
public Integer increase() {
count.set(count.get() + 1);
return count.get();
}
}
class TestThread implements Runnable {
private Count count;
public TestThread(Count count) {
this.count = count;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <= 3; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i
+ "th\t" + count.increase());
}
}
}
public class TestThreadLocal {
public static void main(String[] args) {
Count count = new Count();
Thread t1 = new Thread(new TestThread(count));
Thread t2 = new Thread(new TestThread(count));
Thread t3 = new Thread(new TestThread(count));
Thread t4 = new Thread(new TestThread(count));
t1.start();
t2.start();
t3.start();
t4.start();
}
}
输出
复制代码 代码如下:
Thread-0 1th 1
Thread-0 2th 2
Thread-0 3th 3
Thread-3 1th 1
Thread-1 1th 1
Thread-1 2th 2
Thread-2 1th 1
Thread-1 3th 3
Thread-3 2th 2
Thread-3 3th 3
Thread-2 2th 2
Thread-2 3th 3
上一篇:java并发编程专题(十)----(JUC原子类)基本类型详解
栏 目:JAVA代码
本文标题:实例讲解Java并发编程之ThreadLocal类
本文地址:http://www.codeinn.net/misctech/93083.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




