Java中ThreadLocal的作用是什么

今天就跟大家聊聊有关Java中ThreadLocal的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

如何创建ThreadLocal变量

Java中ThreadLocal的作用是什么

以下代码展示了如何创建一个ThreadLocal变量:

privateThreadLocalmyThreadLocal=newThreadLocal();

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

如何访问ThreadLocal变量

一旦创建了一个ThreadLocal变量,你可以通过如下代码设置某个需要保存的值:

myThreadLocal.set("Athreadlocalvalue”);

可以通过下面方法读取保存在ThreadLocal变量中的值:

StringthreadLocalValue=(String)myThreadLocal.get();

get()方法返回一个Object对象,set()对象需要传入一个Object类型的参数。

为ThreadLocal指定泛型类型

我们可以创建一个指定泛型类型的ThreadLocal对象,这样我们就不需要每次对使用get()方法返回的值作强制类型转换了。下面展示了指定泛型类型的ThreadLocal例子:

privateThreadLocalmyThreadLocal=newThreadLocal<String>();

现在我们只能往ThreadLocal对象中存入String类型的值了。

并且我们从ThreadLocal中获取值的时候也不需要强制类型转换了。

如何初始化ThreadLocal变量的值

由于在ThreadLocal对象中设置的值只能被设置这个值的线程访问到,线程无法在ThreadLocal对象上使用set()方法保存一个初始值,并且这个初始值能被所有线程访问到。

但是我们可以通过创建一个ThreadLocal的子类并且重写initialValue()方法,来为一个ThreadLocal对象指定一个初始值。就像下面代码展示的那样:

privateThreadLocalmyThreadLocal=newThreadLocal<String>(){

@Override

protectedStringinitialValue(){

return"Thisistheinitialvalue";

}

};

一个完整的ThreadLocal例子

下面是一个完整的可执行的ThreadLocal例子:

publicclassThreadLocalExample{

publicstaticclassMyRunnableimplementsRunnable{


privateThreadLocalthreadLocal=newThreadLocal();

@Override

publicvoidrun(){

threadLocal.set((int)(Math.random()*100D));

try{

Thread.sleep(2000);

}catch(InterruptedExceptione){


}

System.out.println(threadLocal.get());

}

}


publicstaticvoidmain(String[]args){

MyRunnablesharedRunnableInstance=newMyRunnable();

Threadthread1=newThread(sharedRunnableInstance);

Threadthread2=newThread(sharedRunnableInstance);

thread1.start();

thread2.start();

}

}

上面的例子创建了一个MyRunnable实例,并将该实例作为参数传递给两个线程。两个线程分别执行run()方法,并且都在ThreadLocal实例上保存了不同的值。如果它们访问的不是ThreadLocal对象并且调用的set()方法被同步了,则第二个线程会覆盖掉第一个线程设置的值。但是,由于它们访问的是一个ThreadLocal对象,因此这两个线程都无法看到对方保存的值。也就是说,它们存取的是两个不同的值。

看完上述内容,你们对Java中ThreadLocal的作用是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恰卡编程网行业资讯频道,感谢大家的支持。

发布于 2021-06-13 23:19:49
收藏
分享
海报
0 条评论
176
上一篇:C语言中字符串数组的示例分析 下一篇:Tomcat中怎么使用IDEA远程调试Debug
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码