编辑介绍每个Thread对象, 内部有一个ThreadLocalMap threadLocals, 这是一个哈希表, 底层是一个Node[ ] table;当在某个线程中调用ThreadLocal的set方法时, 会使用Thread.currentThread获取当前先线程的thread对象, 然后将ThreadLocal对象作为key, 将set方法的参数作为value, 构建一个Entry,
并发编程三大问题在并发编程中,原子性、有序性和可见性是三个重要的问题,解决这三个问题是保证多线程程序正确性的基础。原子性: 指的是一个操作不可分割, 要么全部执行完成, 要么不执行, 不存在执行一部分的情况.有序性: 有序性是指程序的执行顺序与程序中代码的顺序一致。在多线程环境下,由于线程的交替执行和指令重排等因素,可能会导致代码的执行顺序与预期不一致可见性: 可见性是指当一个线程修改了共享变量
对象的内存布局首先抛出一个经典面试题: 一个 Object 对象占多大?这里我用工具打印了出来, 发现是 "16bytes", 也就是 16B; 为什么? 请继续往下看;普通对象(除了数组), 由markword, 类型指针, 实例数据(就是对象里的成员), 对齐填充(整个对象大小要能被8B整数, 方便64bit总线)构成;markword 中保存了监视器锁的信息, GC 的信息, 还可能保存默认
JVM线程 / 操作系统线程操作系统的内核级线程, 是CPU资源调度的最小单位;以最简单的时间片轮转调度算法为例, 在定时中断的中断处理函数中, 操作系统的调度程序选出一个就绪线程, 让其上 CPU 运行;另外还有用户级线程, 由用户应用程序内部自己进行切换, 该过程对操作系统来说并不可见, 在操作系统眼里它就是在执行线程 A, 至于应用在线程内自己分离出来并自己负责切换的线程 A-a 和 线程
ConcurrentHashMap(1.8)HashTable 是早期的线程安全的哈希表, 但是锁的范围太大了, 其 put, get 方法都有 synchronized 关键字修饰, 锁的范围是 hashtable 对象, 并发度太低;JDK1.7 的 ConcurrentHashMap ( 以下简称为 CHM ), 锁的范围是一个段, 段的数量可以在构造的时候指定, 又称并发级别;JDK1.7
ArrayList(JDK8)ArrayList有四个内部类,成员内部类Itr,成员内部类ListItr,静态内部类SubList,ArrayListSpliterator(暂时用不到)Itr是Iterator的实现类,支持正向遍历,ArrayList的iterator方法返回一个Itr对象ListItr是ListIterator的实现类,支持双向遍历,ArrayList的listIterator
如果对文章中提到的与 HashMap 相关的部分有任何疑问, 请移步HashMap源码详解简介底层是一个 Segment[] 数组, 每个 Segment对象 内部又有一个 Entry[ ] 数组, 一个 Entry[] 数组就相当于一个HashMapEntry[ ]采用拉链法解决冲突, 但是没有红黑树, 红黑树是1.8才引入的;一个 Segment对象就是一个段; 当往容器中添加元素调用 put
引入在最小生成树的前两个章节中, 我们介绍了并查集以及基于并查集的 Kruskal 算法;不难看出, Kruskal 算法的时间复杂度主要来自于对所有边按权值排序; 假设图中共有 E 条边, 那么 Kruskal 的时间复杂度为 ElogE;因为我们在并查集中使用了路径压缩算法, 其时间复杂度接近 O(1), 所以整个算法的时间复杂度和排序算法相当, 在使用快速排序的情况下, 就是 ElogE;如
题目: 寻宝题目描述在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿;提取关键: 存在一些点, 存在
并查集本质就是一个数组 int[] father;father[i] = j 表示元素 i 属于 集合 j ;" 集合 j " 说明这个集合以元素 j 为根; 只要一个元素 i 沿着 father 数组能往上找到 j , 那么 i 就属于根为 j 的集合;例如 father = {1, 3, 3, 5, 1, 5};我们希望找到 下标0 所属集合的根, father[0] = 1, father[
本文将从 Nacos 配置中心的基本使用入手, 详细介绍 Nacos 客户端发布配置, 拉取配置, 订阅配置的过程以及服务器对应的处理过程;配置订阅以及热更新原理相关的部分, 我看了主流的博客网站, 绝对没有比这更详细的讲解;Nacos配置中心基本使用一个大型项目, 服务数量会非常多, 每个服务都需要进行配置, 这会导致: 公共的一些配置需要修改时, 需要修改大量服务的配置文件; 并且需要重新启动
上一篇文章中, 详细介绍了 Nacos 注册中心的原理, 相信看完后, 大家应该完全掌握了 Nacos 客户端是如何自动进行服务注册的, 以及 Nacos 客户端是如何订阅服务实例信息的, 以及 Nacos 服务器是如何处理客户端的注册和订阅请求的;本文承上启下, 在订阅服务实例的基础上, 介绍如何在实例之间进行选择, 实现负载均衡; 并详细介绍了负载均衡组件 LocaBanlancer 和函数式
本文将详细介绍 Nacos 客户端在启动时进行自动注册原理, 以及Nacos服务器是如何处理客户端的注册与订阅请求的; 本文会附带源码解读, 但不会死抠每一行代码, 主要是梳理整个流程, 过程中的关键步骤, 都会由思维导图的形式展现出来;Nacos注册中心Nacos 1.X 版本中, 客户端通过发送HTTP请求进行服务注册与发现; 通过一个POST请求进行服务注册, 通过一个GET请求进行服务发现
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障微服务的稳定性。
柔性事务之Seata关于分布式事务的几种解决方案以及刚性事务和柔性事务的概念, 在上一篇文章中已经详细介绍过, 这里不再赘述, 大家自行查看;阿里巴巴有一个付费分布式事务框架, GTS; Seata基于阿里的GTS, 免费的开源分布式事务框架, 支持多种分布式事务模式;XA模式遵循 XA 规范, 采用 2PC 的方式实现分布式事务管理; 是强一致性的事务;TCC模式基于 TCC, 采用 TCC 的
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号