threadlocal

threadlocal

用statc修饰threadlocal对象, 说明是所有线程可共享的, 如果是初始化后,每个线程可以从这个对象中取出自己的threadlocal空间, 对吧? 所以并不是所有线程共用一个threadlocal吧。 ?只是共同调用了这个对象, 然后通过这个对象得到了自己想要的threadlocal中的数据。可以理解为threadlocal对象是一个钥匙, 每个线程进入后可以找到自己的房间。  取出东西。 


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕小班 2021-06-20 19:30:42

同学你好,1、ThreadLocal并不是为了解决共享对象的多线程安全问题,而是为了避免通多参数传递的方式去拿到一个对象。

    2、ThreadLocal是使得各线程能够保持各自独立的一个对象,而实现原理其实是通过,每个线程都会重新创建一个对象,所以对于各自线程创建的对象来说,它是安全的,独有的。

    3、但是在使用线程池复用线程来实现时,不同的请求,由同一个线程做处理,此时就会有数据污染的情况了(线程安全问题),一些特定的业务逻辑下就很有可能出错,或者说是重复。

所以说ThreadLocal并不是完美的,并不能解决共享对象的多线程安全问题。

祝学习愉快~

  • 提问者 rock221 #1

    老师,如果不使用线程池, threadlocal是一个可以解决多线程并发的安全问题吧, 当我们使用完get之后, 给remove清除掉内存也不会造成内存泄露的问题吧。 比如高并发时对数据的更改。 用threadlocal好像是一个不错的办法啊。 

    2021-06-22 21:06:53
  • 提问者 rock221 #2

    老师,如果不使用线程池, threadlocal是一个可以解决多线程并发的安全问题吧, 当我们使用完get之后, 给remove清除掉内存也不会造成内存泄露的问题吧。 比如高并发时对数据的更改。 用threadlocal好像是一个不错的办法啊。 

    2021-06-22 21:07:11
  • 好帮手慕小班 回复 提问者 rock221 #3

    同学你好,同学的理解是正确的,ThreadLocal可以用于解决多线程情况下的线程安全问题,正常使用也不会造成内存泄露的问题,

    祝学习愉快~

    2021-06-23 10:53:07
好帮手慕小班 2021-06-20 17:33:10

同学你好,1、同学的理解是正确的,每个线程都有自己独立的对象。

http://img1.sycdn.imooc.com//climg/60cf09cc09a6286714330414.jpg

    2、ThreadLocal是线程安全的,并不会因为调用remove方法,就出现线程不安全的情况。

http://img1.sycdn.imooc.com//climg/60cf0b280981df1f12890657.jpg

祝学习愉快~

  • 提问者 rock221 #1

    http://img1.sycdn.imooc.com//climg/60cf0dbb09038a7216140572.jpg


    2021-06-20 17:43:44
rock221 提问者 2021-06-20 13:19:18

追加:

http://img1.sycdn.imooc.com//climg/60cecf5809e25e6312020162.jpg

如果不添加remove 方法, 会出现线程不安全的情况,因为其他线程有使用记录,使用过remove之后, 会调用

initialValue方法,那么就会重新new ,不能重复实例对象了,这样和直接new 是一样的吧。 

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师