- 博客(27)
- 收藏
- 关注
原创 二叉树学习笔记
经分析可得出,折痕的分布对应一棵满二叉树,这棵二叉树的头结点是下折痕,每棵左子树的头结点是下折痕,每棵右子树的头结点是上折痕。(3)从node2节点还是往上(整棵树的跟节点)找,每获得一个父节点,检查该节点在不在node1的父节点链中,如果在该节点就是最低公共祖先。完全二叉树:按照从上到下,从左到右的顺序填满节点的二叉树。有一棵新的二叉树的节点类型如下,每个节点parent指针指向父节点,头结点的parent为null。搜索二叉树:整棵树和所有子树都满足,根节点比左子树的所有节点大,比右子树的所有节点小。
2023-02-06 17:50:07 160
原创 Kafka2.2.2源码分析-KafkaController
Kafka2.2.2版本的broker通过Zookeeper实现KafkaController主节点的选举,在整个集群中只有一个broker能当选为KafkaController节点,当活跃的KafkaController节点崩溃时,剩下的broker会再次选举出KafkaController主节点。(6)如果选举失败会抛出异常。(3)获取"/controller"节点的内容(保存的是单选为controller主节点的broker的Id),如果不是-1,表示主节点已经存在,结束Startup事件处理。...
2022-07-28 10:51:21 392
原创 Kafka2.2.2源码分析2-集群启动1-初始集群
场景一:全新的集群,3个broker节点,id分别是0,1,2初始化状态,zk中没有kafka的节点,没有任何topic和partitionbroker节点全部没有启动Kafka初始集群启动的主要流程如下图1、启动KafkaController,成功选举为controller主节点后,向所有的broker(包括自身)发送ApiKeys.UPDATE_METADATA请求,投入RequestSendThread线程的工作队列中,不检查请求的响应结果。partitionStates为空map,请求内容如下。此时
2022-07-09 09:27:44 307
原创 在Window上搭建Kafka2.2.2源码阅读环境
软件版本说明操作系统 win10jdk 1.8.0_191scala 2.12.8gradle 5.2.1kafka 2.2.2一、安装JDK配置环境变量新增系统变量JAVA_HOME: D:\dev_tool\java\jdk_8191_64CLASSPATH: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar配置Path变量增加:%JAVA_HOME%\bin增加:%JAVA_HOME%\jre\bin
2022-05-14 17:44:36 344
原创 MySQL学习笔记
1.基本概念数据库:是文件的集合,是依照一定数据模型组织起来并持久化保存在存储介质中的数据集合。在MySQL中包含:数据文件,索引文件,日志文件(binglog,redo log,undo log,慢查询日志)。数据库实例:指运行的数据库管理软件程序,用户或者应用程序通过数据库实例来操作数据库的数据(文件),而不是直接操作数据库的数据(文件)。2.数据库设计的三大范式是什么?第一范式(1NF):列不可再分。数据库中的字段具有原子性,不可再分,是单一职责。如果两个列的属性相近或一样,需
2022-02-26 17:19:38 624
原创 Netty学习笔记
1.Netty的高性能体现在哪些方面?(1)异步非阻塞通信。使用异步非阻塞通信方式,利用I/O多路复用技术,只需少量的线程就能管理大量的网络连接的读写操作。(2)采用高效的Reactor线程模型。支持三种Reactor线程模型:Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型。(3)串行无锁化设计。NioEventLoop线程池采用串行无锁化执行方式,避免多线程竞争(锁同步)引起的性能下降,比一个队列+线程池模型的性能更好。(4)高效的并发编程。大量使用v
2022-02-17 17:08:35 776
原创 Dubbo源码阅读六:Dubbo动态生成的类
第1节 Dubbo动态生成的类dubbo在调用exportServices()方法时,会使用代码生成技术动态地生成Protocol$Adaptive、ProxyFactory$Adaptive和Wrapper子类这些类。Dubbo使用javassist动态生成类。Dubbo有两个场景使用动态类。1)ExtensionLoader.getExtensionLoader().getAdaptiveExtension()使用JavassistCompiler生成每个类型的Adaptive类。Pro
2022-02-11 12:35:20 3098
原创 Dubbo源码阅读五:DubboBootstrap启动之initialize()
第1节 initialize()的调用过程DubboBootstrap.initialize()方法用于初始化Dubbo容器,详细的调用过程如下图所示。1)初始化Environment,ConfigManager,ServiceRepository全局framework对象。2)启动configCenter配置中心,构建configuration客户端对象,成功连接到config server。3)加载远程配置。4)校验全局配置。5)启动元数据配置中心。6)初始化元数据.
2022-02-09 15:02:19 2525
原创 Dubbo源码阅读四:在Spring下DubboBootstrap的启动过程
第1节 注册DubboApplicationListenerRegistrarSpring在解析xml中的dubbo标签时,会先注册Dubbo的底层BeanDefinition,role类型为BeanDefinition.ROLE_INFRASTRUCTURE,DubboApplicationListenerRegistrar就是在这个时间点注册好的。DubboApplicationListenerRegistrar实现了Spring的ApplicationContextAware接口。
2022-02-09 10:27:51 1261
原创 Dubbo源码阅读三:Dubbo SPI机制二
第1节 ExtensionLoader核心方法 方法名 修饰关键字 作用 ExtensionLoader private 私有构造函数,只被getExtensionLoader()方法调用,保证加载器对象是单例的 loadLoadingStrategies private static 利用Java SPI机制创建Loading
2022-02-07 11:27:46 291
原创 Dubbo源码阅读三:Dubbo SPI机制一
第1节 什么是SPI?SPI是Service provider Interface是一种进程级别的服务发现机制,通过配置来决定进程运行时具体使用接口的哪个实现类。Dubbo SPI做了一些增强,增加了IOC和AOP的特性。Dubbo对配置的文件目录分为三类:1.META-INF/services/目录,此目录下的SPI配置文件用于兼容Java SPI2.META-INF/dubbo/目录,此目录下的SPI配置文件为用户自定义的SPI配置文件3.META-INF/internal/
2022-02-06 21:52:02 1367
原创 Dubbo源码阅读二:在Spring下Dubbo的配置加载
第1节 dubbo标签名字空间处理器在Spring环境下,Dubbo App的启动main方法如下图(注意未使用SpringBoot):需要给Spring容器指定xml配置文件(也可以使用properties格式的配置文件)。Dubbo需要的配置参数在配置文件中指定。Spring启动成功之后会创建这些bean对象。Dubbo自定义了很多标签,Spring默认不支持这些标签。在dubbo.jar中的META-INF路径下有spring.handlers,spring.sc.
2022-01-27 18:16:58 947
原创 Dubbo源码阅读一:Dubbo源码工程结构介绍
Dubbo官网首页:Apache DubboDubbo github地址:https://github.com/apache/dubbo.gitDubbo gitee地址:dubbo: Dubbo 是一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring 框架无缝集成Dubbo源码阅读的tag分支:2.7.10git切换到tag分支2.7.10,工程结构如上图。源码中分了很多模块,为了简化应用服务的使用,利用mvn打..
2022-01-27 09:07:30 366
原创 学习笔记——分布式一致性协议
1.分布式一致性协议两阶段提交2PC三阶段提交3PCPaxos算法Multi PaxosEPaxosFast PaxosRaft算法ZAB算法2.拜占庭将军问题拜占庭帝国疆域辽阔,有众多军队。为了防御的目的,这些军队驻扎在不同的区域,彼此之间只能通过信使进行通讯。在打战的时候,为了更好的赢得胜利,拜占庭军队内所有的将军必须达成一致的共识,执行相同的行动计划。但是信使可能是奸细,也可能叛变,篡改信件影响将军们的决定。在这种条件下,有没有办法让将军们达成一致的共识?
2021-11-11 16:46:55 439
原创 Java笔记——Java线程
1.Java线程进程是操作系统分配资源的最小单元。线程是操作系统调度的最小单元。在一个进程中可以创建多个线程,每个线程都拥有自己的程序计数器、堆栈和本地变量(ThreadLocal)。Java程序再简单也是多线程的,除了main线程外,JVM还会启动很多后台线程(垃圾清理,类加载等等)。1.1 为什么要使用多线程?(1)现代处理器采用多核心架构,单线程无法充分利用多核心的计算能力。多线程在多个核心同时执行,可以大大加快程序的处理速度。(2)在复杂的业务处理中,有些操作(包
2021-11-06 10:28:29 117
原创 学习笔记——分布式架构1-CAP和BASE理论
CAP定理CAP定理指一个分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)、分区容错性(P:Partition tolerance)这三个基本需求,最多同时满足其中的两项。一致性(Consistency)这里指强一致性,指数据在多个副本中是否能够保持一致。在分布式系统中数据通常分布在多个节点中,有多个副本。在强一致性模型中,对一个副本的修改操作,能够立即在其他副本生效,也就是说在一个节点上对一个副本执行修改后,通过其他节点能立即读取到这
2021-11-01 12:02:54 161
原创 Java笔记——Java并发4-Java的Lock锁2
锁的可重入性同一个线程获取锁之后,能再次重复加锁,这个锁就是可重入的。锁的公平性获取锁的顺序与线程请求加锁的顺序一致,这个锁就是公平的。线程获取锁等待的时间越长优先获取锁。公平锁比非公平锁的效率要低,在竞争很激烈时,会造成大量的让步式上下文切换。公平锁为了控制加锁的顺序,锁一旦被加上之后,后续的线程都必须进入同步队列等待,通常自旋获取不到锁,进而线程阻塞等待,直到被唤醒之后才能获得锁。非公平锁被加上之后,未入同步队列的线程有机会直接竞争到锁而不必进入同步队列阻塞等待。锁的
2021-10-30 17:54:06 114
原创 Java笔记——Java的Lock锁
1.锁锁用来控制多线程按照顺序访问临界资源,通常用锁限制同一时间内只有一个线程能访问到临界资源;读写锁对于临界资源的读取操作同一个时间内允许多个线程同时访问,写资源必须互斥执行。Java提供两种锁synchronizedLock锁(实现Lock接口的锁)Lock锁的特点(1)能尝试非阻塞的获取锁;(2)能响应中断,Lock.lockInterruptibly()阻塞等待锁时能响应中断,Lock.lock()不响应中断(3)能超时获取锁,如果超时会返回,不会一直阻塞等待
2021-10-28 17:20:43 454
原创 Java笔记——Java并发-concurrent包的整体架构
concurrent包分层实现最底层是volatile读/写和CAS;第二层基础类是AQS、非阻塞数据结构和原子变量类;这些基础类使用类似的实现方式:(1)声明共享变量(状态)为volatile类型;(2)使用CAS原子更新完成线程之间的同步;(3)利用volatile读/写的内存语义和CAS同时具备的volatile读和写的内存语义实现线程之间的通信。第三层高层类是Lock、同步器、阻塞队列、Executor和并发容器。高层类基于第二层的基础类实现。参考资料《Jav..
2021-10-21 11:16:51 187
原创 Java笔记——Java并发3-Java内存模型2
JMM的设计思想:先保证正确性,然后尽量优化保证执行性能JMM的设计意图程序员对内存模型的要求,易于理解,易于编程,希望内存模型足够强,足有严格。编译器和处理器为了尽可能地提高并行度,希望内存模型的约束越少越好。对于会改变程序执行结果的重排序,JMM要求编译器和处理器禁止重排序;对于不会改变程序执行结果的重排序,JMM对编译器和处理器不做要求。1.volatile的内存语义与实现1.1 volatile写-读建立的happens before关系volatile写ha
2021-10-20 15:15:14 91
原创 Java笔记——Java并发3-Java内存模型
1.并发编程模型的两个关键问题在并发编程中,需要解决线程之间如何通信和线程之间如何同步两个关键问题。线程通信是指不同的线程之间交换数据(信息),有两种通信机制:共享内存和消息传递。线程同步是指通过特定方式控制不同线程执行的先后顺序。Java的同步方式有volatile,synchronized,final,Lock等。在共享内存的线程通信模式中,线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信。在消息传递的线程通信模式中,线程之间不共享公共状态,线程通过发送消息进行显
2021-10-17 17:45:34 120
原创 Java笔记——Java并发2
1.什么是上下文切换?CPU并发执行线程任务。CPU将执行时间分成若干个小的时间片,每次分配给线程的是一小段时间片。线程在自己的时间片执行完之后需要让出CPU,在让出CPU之前需要保持线程当前的运行状态,便于线程下次执行的时候能从中断的位置继续执行。线程下次获得CPU时间片时,首先加载上次保存的运行状态,让后从上次中断的地方继续执行。线程任务从保存到再加载运行状态的过程被称为上下文切换。显然上下文切换是浪费CPU的操作,但是能够并发执行多线程,这点开销是可以接受的,利大于弊。2.上下文切换有
2021-10-10 17:45:04 124
原创 Java笔记——Java并发
进程和线程的区别进程是操作系统分配资源(进程id、虚拟内存,文件、socket资源等等)的最小单元;线程是操作系统进行任务调度的最小单元,线程隶属于进程。1,Java如何开启线程?怎么保证线程安全?开启线程的方法:1)继承Thread类,实现run方法,调用start方法;2)实现Runnable接口,实现run方法,通过Thread类或者线程池类启动;3)实现Callable接口,实现call方法,通过FeatureTask创建线程,可以获取执行结果;4)通过线程池启动
2021-10-09 18:09:08 139
原创 Java笔记——Java transient关键字
1.transient只能修饰类成员变量,不能修饰方法和类,也不能修饰方法变量和方法参数变量;2.transient关键字需要结合Serializable接口使用;当使用Externalizable接口时,仅序列化指定的字段,transient将会失效;3.被transient修饰的类成员变量不再能被序列化,类的静态成员变量无论是否有transient修饰都不会被序列化;4.被transient修饰的类成员变量在反序列化时按照默认方式初始化。5.fastjson序列化默认会忽略transie
2021-10-09 09:01:13 334
原创 Flink v1.12 on YARN
版本号说明Flink v1.12.xhadoop 2.10.x第1节 YARN环境准备见《hadoop分布式集群搭建》篇第2节 安装flink(1)deploy用户登陆hadoop219(2)上传flink-1.12.1-bin-scala_2.11.tgz从官网下载:flink-1.12.1-bin-scala_2.11.tgz上传到/opt/software[deploy@hadoop219 software]$ cd /opt/software/[
2021-10-08 15:34:54 346
原创 Java笔记——谈谈对ThreadLocal的理解
1.什么是ThreadLocal?ThreadLocal是Java为Thread提供的本地存储机制,可以在Thread通过ThreadLocal(set方法)缓存数据,缓存之后可以在线程执行时的任意执行点、任意时间点获取(get方法)缓存的数据。Thread的ThreadLocal本地存储内存区相互隔离,并不共享;但是如果ThreadLocal关联的缓存数据为堆对象时,不同的Thread的ThreadLocal关联到同一个堆对象,这个时候如果有修改操作不是线程安全的。2.ThreadLoca
2021-10-08 15:03:16 196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人