ThreadLocal工具类 隔离思想

摘要:
set仅仅是表示将线程ThreadLoaclMap中table处的value值重新设置,即覆盖。

ThreadLocal不是用来解决共享对象的多线程访问问题的

通过ThreadLocal的set()方法设置到线程的ThreadLocal.ThreadLocalMap里的是是线程自己要存储的对象,其他线程不需要去访问,也是访问不到的。各个线程中的ThreadLocal.ThreadLocalMap以及ThreadLocal.ThreadLocal中的值都是不同的对象。

set仅仅是表示将线程ThreadLoaclMap中table处的value值重新设置,即覆盖。

对于同一个ThreadLocal对象而言,set后,table中绝不会多出一个数据:

1
2
3
4
publicclassTools
{
publicstaticThreadLocal<String> t1 =newThreadLocal<String>();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
publicclassThreadLocalThreadextendsThread
{
privatestaticAtomicInteger ai =newAtomicInteger();
publicThreadLocalThread(String name)
{
super(name);
}
publicvoidrun()
{
try
{
for(inti =0; i <3; i++)
{
Tools.t1.set(ai.addAndGet(1) +"");
System.out.println(this.getName() +" get value--->"+ Tools.t1.get());
Thread.sleep(200);
}
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
<wiz_tmp_tag class="wiz-block-scroll">

1、ThreadLocal不是集合,它不存储任何内容,真正存储数据的集合在Thread中。ThreadLocal只是一个工具,一个往各个线程的ThreadLocal.ThreadLocalMap中table的某一位置set一个值的工具而已2、同步与ThreadLocal是解决多线程中数据访问问题的两种思路,前者是数据共享的思路,后者是数据隔离的思路

3、同步是一种以时间换空间的思想,ThreadLocal是一种空间换时间的思想

4、ThreadLocal和request区别:

(1)ThreadLocal只能存一个值,一个Request由于是Map形式的,可以用key-value形式存多个值

(2)ThreadLocal一般用在框架,Request一般用在表示层、Action、Servlet

免责声明:文章转载自《ThreadLocal工具类 隔离思想》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇部分cocoscreator左右移动代码《Excel VBA编程开发》附加内容1:VBA生成GUID下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

3.jmeter jsr232 脚本获取当前测试的正在活动的线程数

jsr232groovy脚本获取当前测试的正在活动的线程数(需要选择 groovy类型, 如果使用beanshell或者javascript,请根据其语法稍作修改即可) import org.apache.jmeter.threads.JMeterContextService log.info(String.valueOf(JMeterContextSer...

WPF Dispatcher.BeginInvoke子线程更新UI

在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象。“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者Invoke()方法。 Dispatcher.BeginInvoke() //异步执行,不等待委托结束就更新 Dispatcher.Invoke()     ...

多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比

Thread.Start(),ThreadPool.QueueUserWorkItem都是在实现多线程并行编程时常用的方法。两种方式有何异同点,而又该如何取舍? 写一个Demo,分别用两种方式实现。观察各自的现象。  一个WorkMan class,其内的method doSomething()是每次异步线程调用的方法。该方法只是随机的让线程休眠一段时间。...

windows线程yield以及Sleep(0)和SwitchToThread之间的区别

C++的自定义线程函数内调用了一个自定义的yield()接口。 在windows上是调用了SwitchToThread来实现的,linux是pthread_yield实现的。 Sleep(0):时间片只能让给优先级相同或更高的线程; SwitchToThread():只要有可调度线程,即便优先级较低,也会让其调度。 下面是MSDN上对Sleep函数的描述:...

Java多线程-线程的调度(休眠)

Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。...

Linux获取线程tid线程名

Linux获取线程tid线程名 1 2 3 4 5 6 //thread name char cThreadName[32] = {0}; prctl(PR_GET_NAME, (unsigned long)chThreadName); //tid syscall(SYS_gettid)...