首页 > 试题广场 >

对于线程局部存储TLS(thread local stora

[不定项选择题]
对于线程局部存储TLS(thread local storage),以下表述正确的是
  • 解决多线程中的对同一变量的访问冲突的一种技术
  • TLS会为每一个线程维护一个和该线程绑定的变量的副本
  • 每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了
  • Java平台的java.lang.ThreadLocal是TLS技术的一种实现
我觉得吧 threadlocal只是一个key,具体的副本值value保存在thread对象的map里面,多个线程可以通过同一个key取出自己map里面对应的value。这么来说的话,threadlocal的get和set都操作的是每个thread自己的数据实际上threadlocal对象自身没有变化,只是每个线程把同一个threadlocal对象当做一把打开自己map的钥匙而已,多个thread是可以并发调用get和set的并且不出错。做了同步会访问阻塞感觉没什么必要。。。。。。。。算了不说了我去翻翻书算了。。对threadlocal没啥印象了
发表于 2017-10-19 00:07:33 回复(0)
更多回答
推荐
ABD
C:同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其它线程的副本冲突。
编辑于 2015-01-09 11:14:28 回复(10)
XQ头像 XQ

  ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制.

发表于 2015-08-31 14:05:56 回复(7)
如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错
发表于 2015-08-19 00:07:10 回复(4)
ThreadLocal确实是保证了每一个线程都拥有一个变量的副本,而且这个副本的初始值取决于ThreadLoacl中initialValue方法的重写,如果initialValue方法中引用了一个全局的变量的地址,那么其他线程对全局变量的修改还是会影响到此线程中引用变量的内容。
发表于 2015-08-19 12:09:43 回复(14)
3 中如果存放引用副本则不正确。
编辑于 2015-08-13 22:29:34 回复(1)
C是错误的:如果ThreadLocal本地变量的类型是不变类如 String,Integer,Long等)或线程绝对安全的类,那么在多线程下访问同一个ThreadLocal本地变量时是不需要进行同步的,否则就算是相对线程安全的类(如Vector等)还是需要进行同步的。

绝对线程安全:任何环境下都不需要考虑额外的同步措施
相对线程安全: 在一般情况下,调用者不需要考虑线程同步,能够正常运行。jdk里面大多数类都是相对安全的。比如在组合使用线程安全的单一方法时。

题目中说到同步,其实就会让人想到并发,说到并发就会想到并发中三个最核心的特性 原子性(Atomicity)、可见性(Visibility)、有序性(Ordering)。Java内存模型就是围绕着在并发过程中如何处理这三个特性而建立的。显然ThreadLocal对本地变量并没有提供这三个特性,所以该同步时还得同步,该出手时还得出手啊。
发表于 2016-09-23 19:56:37 回复(0)
我个人看法,但请认真看完:Threadlocal不是用来做多线程的,是用来处理线程本身不想共享,但是由于多线程的存在又会导致该变量被共享的变量。于是采用空间换时间,用副本代替的加锁。所以这个副本在逻辑上是不可以被共享的,所以就不能是static的,但是语法上可以让副本是一个static的引用变量,所以Threadlocal是没办法保证任何时候都是线程安全的。因为当你将一个static引用作为initialValue()方法的返回值时,你已经违背了当初为什么要用Threadlocal的初衷,所以线程不安全是你挑的嘛偶像!
发表于 2022-02-04 13:55:36 回复(2)
还是需要同步的 保持副本对读并没有影响 但对写还是有影响的 就如购买机票来说 虽然每个线程都有副本 但是如果有人买票的话 票减少一个 每个线程里的副本还得都减一
发表于 2017-03-29 17:44:43 回复(4)
c哪儿错了,如果是同一个引用那就不叫副本了,如果想在外部修改该线程的threadlocalmap,那压根就不该用threadlocal实现!
发表于 2015-08-18 04:40:30 回复(1)
感觉是AB
发表于 2015-06-22 08:44:47 回复(0)
个人的理解是:即使每个线程保存了一个副本,但是如果不对原来的变量实行同步控制的话,还是会引起错误。因为每个线程只看到副本,而原数据不控制的话,就会造成混乱。
发表于 2016-08-04 16:05:30 回复(2)
<p>做了1000多道快完了,终于全对了一次</p><p><br></p>
发表于 2020-10-23 00:41:13 回复(0)
天秀 蒙一个c
发表于 2019-09-02 09:29:12 回复(0)
a???,同一变量???用threadlocal不是一个线程有自己的变量么?
发表于 2019-05-06 15:41:13 回复(0)
答案C就是错的.
既然每个变量都有副本,多线程各用各的数据,同步干嘛?
既然要共享数据,要同步,又用ThreadLocal干嘛呢?
不能因为答案给了个C,就非得找个合理的解释,毕竟答案也不一定对.
***的新装看不见,不能解释为是我们脑子不够聪明,事实就是他在裸奔.
发表于 2019-03-26 16:39:20 回复(0)
如果ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问题。 
发表于 2017-06-15 16:16:25 回复(0)
需要看变量是做什么用的才能决定需不需要同步,不能太绝对。
发表于 2016-02-04 15:37:46 回复(0)
C:如果这个变量是个引用,那每个线程的副本都可以操控这个对象的方法和变量
发表于 2023-02-14 16:10:26 回复(0)
插眼
发表于 2022-11-06 19:22:37 回复(0)
ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制.
发表于 2022-11-04 08:25:28 回复(0)