多线程-并发编程、面试难点(线程合集)

问:对volatile关键字的理解?

答:volatile关键字只能使用在变量上,表明该变量所有线程可见,这意味着无论哪个线程修改该变量,其他线程都会立即同步更新到修改的最新值。这也表明了,它不是线程安全的。它可以应用到标记某个线程的状态,比如在后面即将谈论到的Lock类中,就有一个字段state通过volatile标记,当锁被获取后,就会修改这个值,通知其他线程锁已被获取,让其他线程去排队。

问:对ThreadLocal的理解

//创建一个ThreadLocal变量
static ThreadLocal<String> localVariable = new ThreadLocal<>();

答:ThreadLocal类保证了每个访问这个变量的线程在它自己的线程内都会有这个变量的拷贝,不受其他线程的影响,也就是说,它保证了在操作当前变量的时候不会收到其他线程的影响。起到了线程隔离的作用,维护了线程安全。它的应用场景就是数据库的连接池。

问:对ThreadLcoal原理的理解。

答:ThreadLocal底层是ThreadLocalMap实现的,和Map原理很像,ThreadLocalMap维护了一个Entry数组,Entry通过键值对的方式存储ThreadLocal对象和value值,其中,ThreadLocal对象作为键,value作为值。

问:了解ThreadLocal的内存泄露问题吗?

因为ThreadLocalMap中使用的 key 为 ThreadLocal 的弱引用;什么叫弱引用,当一个对象只被弱引用引用时,在垃圾回收器执行垃圾回收时,该对象就会被回收,即使 JVM 内存充足,也可能会被回收。

//弱引用创建方式
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);

因此当该对象被回收后,在ThreadLocalMap中,对应的key已经没了,但value还在,就会造成内存泄漏,如何解决?在使用完ThreadLocal后,及时调用remove()方法释放内存空间,这样key,value就会一同清除。

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值