IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构补充一篇 -> 正文阅读

[数据结构与算法]数据结构补充一篇

前言

不论是对于Android基础还是java基础,数据结构这块都是必备基础知识,这里整理总结一下,根据其他文章用到的来讲,用到一个这里就补充一个:

ThreadLocal

ThreadLocal在Handler机制讲解中涉及到了,因此这里补充一篇ThreadLocal的相关内容;

ThreadLocal的作用

首先,ThreadLocal主要用来做线程间数据的隔离

ThreadLocal的实现原理

ThreadLocal是如果做到进程间的隔离的呢,首先,它里面维护了一个数组,这要注意的是Android24以后做了写改变,

  • android23版本:ThreadLocal的内部类Values,里面维护了Object[] table数组,根据key的hash算出数组坐标i,那么value的坐标就是i+1;
  • Android24版本:ThreadLocal的内部类ThreadLocalMap维护了Entry数组,ThreadLocalMap的内部类Entry其实就是ThreadLocal,维护了value的值
  • ThreadLocal的内部结构如图所示:
    在这里插入图片描述
  • 拿到当前的线程中的ThreadLocalMap对象,并且调用map的set和get方法,key都是ThreadLoacal
  • 不论get还是set方法,都是通过key去计算下标
  • 通过AtomicInteger.getAndAdd(0x61c88647) 这个计算方法保证ThreadLoacal相同的情况下,hash值肯定不同,其中0x61c88647这个数值是一个散列码,能够近似分别最优算法,这也是解决map冲突的一个关键
map.set(this, value);     //set方法赋值
ThreadLocalMap.Entry e = map.getEntry(this);  //get方法取值
//上面this就是ThreadLoacal,也就是下面的key值
//通过key值计算出下标的位置:AtomicInteger.getAndAdd(0x61c88647) 这个计算方法保证ThreadLoacal相同的情况下,hash值肯定不同
//0x61c88647这个数值是一个散列码,能够近似分别最优算法
  int i = key.threadLocalHashCode & (table.length - 1);
  Entry e = table[i];

在这里插入图片描述
在这里插入图片描述

问题1:ThreadLocal如何做到线程间的数据隔离的呢?

ThreadLocal类提供线程本地变量。线程本地变量的线程都将拥有一个属于它们自己的独立初始化的副本。
从上图可以看到,ThreadLocalMap.Entry作为Thread的成员变量,每个线程都是通过ThreadLocalMap.Entry来管理数据的,我们在执行set和get操作的时候,其实就是获取当前线程,并对成员变量ThreadLocalMap.Entry进行get和set操作。

ThreadLocal类有哪些方法,它们都是做什么的?

  • T get()
  • void set(T value)
  • T initialValue()
  • void remove()

ThreadLocal变量和synchronized关键字的区别是什么

ThreadLocal变量和synchronized关键字都是用来解决线程安全问题的,但是两者解决问题的思路完全不同。ThreadLocal使得每个线程都有自己的局部变量资源,因此多个线程之间互不干扰,从而实现线程安全。synchronized关键字保证每个时刻只能有一个线程访问共享变量,从而保证了线程安全。

你能想到哪些使用ThreadLocal的典型场景

handler中就是用了ThreadLocal

ThreadLocal为什么会导致内存泄露

  1. ThreadLocal为每个线程提供了本地变量,变量是被线程持有的,包括:ThreadLocalMap,以及Entry对象
  2. 当线程销毁的时候,这些对象自然就消失了,但是如果我们使用的ThreadLocal是静态或者使用的线程池的时候,这个对象可能就被长期持有,容易容易造成内存溢出
  3. Entry其实是ThreadLocal的弱引用,从一定程度上做了内存的优化处理,因为ThreadLocal在set和get 的时候,都会调用expungeStaleEntry方法,也就是当key为null的时候,清除对应的Entry实体
  4. 我们也可以在每次使用完ThreadLocal的时候,手动调用remove方法把数据清理掉
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-14 21:25:47  更:2022-02-14 21:28:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:46:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码