Thread线程副本

分成ThreadLocal 和 InheritableThreadLocal
ThreadLocal的数据结构(重点):
1)基于jdk1.8
2)每个Thread有ThreadLocal.ThreadLocalMap.threadlocals属性
3)ThreadLocalMap中使用数组储存当前线程的所有对象

缺点:
1)内容泄露
2)父子线程数据传递

ThreadLocalMap(难重点):
1.数据结构:
1)数据结构类似HashMap,但是没有链表结构
2)Entry key:ThreadLocal弱引用类型 value:object
(弱引用类型:
在Java中,ThreadLocal类的实例可以存储线程本地的变量。它提供了一种线程隔离的机制,使得每个线程都可以拥有自己的变量副本,而不会相互干扰。

ThreadLocal类的实现中使用了弱引用类型来引用线程本地变量。弱引用是一种相对较弱的引用类型,不会阻止被引用对象的垃圾回收。当线程本地变量不再被引用时,垃圾回收器可以自动回收该变量所占用的内存空间。

使用弱引用类型的好处是,当线程结束或被销毁时,线程本地变量会自动被回收,不会造成内存泄漏。这对于长时间运行的应用程序来说非常重要,因为它可以避免由于线程本地变量未被正确清理而导致的内存泄漏问题。

需要注意的是,尽管ThreadLocal使用了弱引用类型来引用线程本地变量,但是对于线程本地变量本身的引用,ThreadLocal并不使用弱引用。这意味着,只要线程还在运行,线程本地变量就不会被垃圾回收。只有当线程结束或被销毁时,线程本地变量才会被回收。

总结起来,Java中的ThreadLocal使用弱引用类型来引用线程本地变量,以避免内存泄漏问题。但是需要注意,只有当线程结束或被销毁时,线程本地变量才会被回收。)
3)Initial_Capacity:16
4)存储数据的数组:Entry【】table
5)扩容阈值:threshold(默认为数组大小的2/3)

2.set()方法
3.get()方法
4.探测式清理
探测式清理(Probing-based Garbage Collection)是一种垃圾回收算法,用于回收不再使用的内存空间。它通过扫描内存中的对象,并标记那些不再被引用的对象为垃圾,然后将这些垃圾对象回收并释放其占用的内存空间。

探测式清理的基本思想是通过从根对象开始,递归地遍历对象图,将可达的对象标记为活动对象,而未被标记的对象则被认为是垃圾对象。探测式清理算法通常使用标记-清除(Mark and Sweep)或标记-压缩(Mark and Compact)的方式进行垃圾回收。

在探测式清理中,垃圾回收器会维护一个根集合,根集合包含了一组根对象,这些对象是程序中可以直接访问到的对象,如全局变量、静态变量等。垃圾回收器从根集合开始遍历对象图,将可达的对象标记为活动对象。然后,回收器会对整个堆内存进行扫描,将未被标记的对象标记为垃圾对象,并进行回收。

探测式清理算法的优点是可以有效地回收不再使用的内存空间,避免内存泄漏。然而,它也存在一些缺点。首先,探测式清理会暂停程序的执行,进行垃圾回收操作,可能会导致一些性能问题。其次,探测式清理算法需要遍历整个对象图,对大型堆内存来说,回收操作可能会比较耗时。

为了解决探测式清理算法的一些缺点,还有其他的垃圾回收算法,如分代回收、复制回收等。这些算法可以根据对象的生命周期和特点来选择不同的回收策略,以提高垃圾回收的效率和性能。
5.启发式清理
启发式清理(Heuristic Cleaning)是一种垃圾回收算法,用于回收不再使用的内存空间。与传统的探测式清理不同,启发式清理算法根据一些启发式规则来判断对象是否为垃圾,从而进行回收。

启发式清理算法通常基于一些经验规则和统计信息来进行垃圾回收。它可以通过观察对象的生命周期、访问模式、内存使用情况等来判断对象是否为垃圾。根据这些规则,启发式清理算法可以更准确地判断对象的存活状态,从而避免对仍然活跃的对象进行回收。

启发式清理算法的优点是可以提高垃圾回收的效率和性能。通过根据经验规则和统计信息来判断对象的存活状态,可以更准确地标记和回收垃圾对象,避免对仍然活跃的对象进行不必要的回收操作。这可以减少回收器的工作量,提高垃圾回收的速度和效率。

然而,启发式清理算法也存在一些缺点。首先,由于启发式规则是基于经验和统计信息,可能会存在误判的情况,即将仍然活跃的对象误判为垃圾对象,导致错误的回收。其次,启发式清理算法相对于传统的探测式清理算法更加复杂,实现和调试可能会更困难。

因此,启发式清理算法通常用于一些特定的场景和需求,如实时系统、大规模内存应用等,以提高垃圾回收的效率和性能。在一般的应用中,传统的探测式清理算法通常已经能够满足需求。

6.扩容机制
1)当数组元素达到扩容的阈值,数组就会进行rehash扩容
2)rehash进行一次就会启动探测式清理,清楚线程中的key值
3)清理过后数组的大小大于或等于数组的一半: len2/33*4开始扩容
Callable接口
Callable接口是Java中的一个函数式接口,它定义了一个可以被调用并返回结果的任务。它只有一个方法call(),该方法可以带有泛型参数,用于指定返回结果的类型。与Runnable接口不同,Callable接口的call()方法可以抛出异常,并且可以返回一个结果。

Callable接口通常与ExecutorService线程池结合使用,通过submit()方法将任务提交给线程池执行,并返回一个Future对象,可以通过Future对象获取任务的执行结果或取消任务的执行。

使用Callable接口可以实现更加灵活的多线程编程,可以获取任务的执行结果,可以捕获任务执行过程中的异常,还可以取消任务的执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值