博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java ThreadLocal使用
阅读量:6954 次
发布时间:2019-06-27

本文共 2112 字,大约阅读时间需要 7 分钟。

ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量。

1.如何创建ThreadLocal变量

以下代码展示了创建ThreadLocal变量的三种方式:
方式一:直接创建对象
private ThreadLocal myThreadLocal = new ThreadLocal();
方式二:创建泛型对象
private ThreadLocal myThreadLocal = new ThreadLocal<String>();
方式三:创建泛型对象及初始化值

private ThreadLocal myThreadLocal = new ThreadLocal
() { @Override protected String initialValue() { return "This is the initial value"; }};

通过代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用ThreadLocal的set()方法设置的值。即使是两个不同的线程在同一个ThreadLocal对象上设置了不同的值,他们仍然无法访问到对方的值。

创建ThreadLocal对象时,我们可以指定泛型,这样我们就不需要每次对使用get()方法返回的值作强制类型转换了;并且我们也可以设置初始值。

2.如何访问ThreadLocal变量

一旦创建了一个ThreadLocal变量,你可以通过如下代码设置某个需要保存的值:
myThreadLocal.set("初始值”);
可以通过下面方法读取保存在ThreadLocal变量中的值:
String threadLocalValue = (String) myThreadLocal.get();
get()方法返回一个Object对象,set()对象需要传入一个Object类型的参数。

  1. 测试代码
public class Test {    private static ThreadLocal
threadLocal; public static void main(String[] args) { threadLocal = new ThreadLocal
() { @Override protected String initialValue() { return "初始化值"; } }; for (int i = 0; i < 10; i++){ new Thread(new MyRunnable(), "线程"+i).start(); } } public static class MyRunnable implements Runnable { @Override public void run() { String name = Thread.currentThread().getName(); System.out.println(name + "的threadLocal"+ ",设置为" + name); threadLocal.set(name); try { Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println(name + ":" + threadLocal.get()); } }}

打印结果:

线程1的threadLocal,设置为线程1线程4的threadLocal,设置为线程4线程3的threadLocal,设置为线程3线程2的threadLocal,设置为线程2线程0的threadLocal,设置为线程0线程6的threadLocal,设置为线程6线程5的threadLocal,设置为线程5线程7的threadLocal,设置为线程7线程8的threadLocal,设置为线程8线程9的threadLocal,设置为线程9线程3:线程3线程4:线程4线程8:线程8线程6:线程6线程2:线程2线程5:线程5线程9:线程9线程1:线程1线程7:线程7线程0:线程0

转载地址:http://bdtil.baihongyu.com/

你可能感兴趣的文章
bootstrap 模态框动态加载数据
查看>>
Android应用程序进程启动过程(前篇)
查看>>
初始化构造函数中定义的实体集合,方便嵌套类型的遍历
查看>>
[转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
查看>>
Zygote进程【1】——Zygote的诞生
查看>>
深入理解css3中nth-child和 nth-of-type的区别
查看>>
Spring MVC学习笔记——引入静态文件
查看>>
MySQL慢查询Explain Plan分析
查看>>
MyBatis原理分析之三:初始化(配置文件读取和解析)
查看>>
AndroidStudio非法字符: '\ufeff'解决
查看>>
GC是如何回收SoftReference对象的
查看>>
\Temporary ASP.NET Files\root\文件不断增长,如何处理?
查看>>
wireshark长时间抓包分多个文件
查看>>
009 pandas的Series
查看>>
WPF 图形绘制 及各种线帽、箭头的实现
查看>>
Pyinstaller如何将资源文件一起打包至exe中
查看>>
【Linux】数组与关联数组
查看>>
JavaScript:属性的操作
查看>>
js Object.defineProperty 使用
查看>>
180321
查看>>