ThreadLocal、守护线程简介

ThreadLocal(为了解决多线程中相同变量的访问冲突问题)
ThreadLocal是线程安全的,本质是一个内部的静态map,不提供遍历和查询接口,每个线程只能获取自己线程的value

ThreadLocal基本方法
get()获取当前线程中保存的变量副本
set()设置当前线程中变量的副本
remove()移除当前线程中变量的副本
initialValue() 是一个protected方法,一般是用来在使用时进行重写的,它是一个延迟加载方法

Synchronized是通过线程等待,牺牲时间来解决访问冲突
ThreadLocal是通过每个线程单独一份存储空间,牺牲时间来解决冲突,具有线程隔离的效果

总结
1.通过ThreadLocal创建的副本时储存在每个线程自己的threadLocals中的
2.每个线程可以有多个threadLocal变量
3.在进行get之前,必须先set,否则会报空指针异常,重写initialValue()可不用调set方法
4.ThreadLocal不支持继承性

ThreadLocalMap
ThreadLocalMap中的Entry的key使用的是ThreadLocal对象的弱引用,在没有其他地方对ThreadLoca依赖,ThreadLocalMap中的ThreadLocal对象就会被回收,但对应的不会被回收,这个时候Map中可能存在key为null但value不为null的项,需要在使用完毕时调用remove方法避免内存泄漏

守护线程(也称服务线程,在没有用户线程可服务时会自动离开,通过setDaemon(true)来设置)
User Thread(用户线程) Daemon Thread(守护线程)

区别
如果 User Thread全部退出运行了,只剩下Daemon Thread存在,虚拟机也就退出了。 因为没有了被守护者,Daemon也会结束,最典型的应用时GC(垃圾回收器)

注意
thread.setDaemon(true)必须在thread.start()前设置,否则会抛异常
在Daemon线程中产生的新线程也是Daemon的
不是所有应用都能分配给Daemon进行服务,不如读写或计算逻辑

应用
qq,微信等软件,主程序时非守护线程,所有聊天窗口是守护线程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值