Russ Xia Blog

身处寒夜,把握星光。

Dubbo源码笔记(二)

Dubbo源码学习笔记

dubbo spi: 官方文档 dubbo框架设计:官方文档 dubbo源码分析:官方文档 服务发现 Dubbo服务引用分两种:饿汉式和懒汉式,默认使用的时懒汉式。第一种饿汉式在Spring容器初始化时,调用ReferenceBean的afterPropertiesSet方法时引用服务;第二种懒汉式,在对应服务被注入到其他类中时,Spring会调用getObject()方法...

Dubbo源码笔记(一)

Dubbo源码学习笔记

官方文档目前的内容时基于2.6.x版本的,我下载的源码是2.7.2的。大体内容以官方文档为主,这里记一些官方文档不全的/自己看文档时迷惑过的内容。 dubbo spi: 官方文档 dubbo框架设计:官方文档 dubbo源码分析:官方文档 服务导出 Dubbo以ServiceConfig, ReferenceConfig 为中心,对应的Spring入口就是ServiceB...

Dubbo反序列化抛出的空指针异常问题

Dubbo线上踩坑问题排查记录

起因 线上出现了一段空指针异常,根据异常栈和经验,第一时间的反应是消费者段在发序列化的时候报错了,觉得应该是返回值在反序列化时出问题。但是前前后后检查了好几次返回值,都没有发现有什么有问题的地方。下面是异常堆栈: java.lang.NullPointerException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(N...

Kafka的三种消息投递语义

Kafka的三种消息投递语义以及如何保证幂等

Kafka的三种消息投递语义 Kafka支持的三种消息投递语义: at most once:至多一次,消息可能会丢,但不会重复 at least once:至少一次,消息肯定不会丢失,但可能重复 exactly once:有且只有一次,消息不丢失不重复,且只消费一次。 at least once 和 at most once 消息的投递和消费分为两端:producer-br...

Kafka+Flume+HDFS的实时采集

Kafka+Flume+HDFS的实时采集,组件配置

准备 zookeeper: https://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/ kafka: https://www.apache.org/dyn/closer.cgi?path=/kafka/2.2.0/kafka_2.11-2.2.0.tgz flume: http://www.apache.org/dy...

CountDownLatch、CyclicBarrier与Semaphore

Java中的信号量及其源码解析

CountDownLatch CountDownLatch可以实现多线程之间的计数功能,并实现了阻塞功能。其内部通过实现了AQS的java.util.concurrent.CountDownLatch.Sync保证线程之间同步修改count值。 在构造CountDownLatch的时候,传入计数值,并在构造函数内完成sync的初始化。 public CountDownLatch(int ...

Java线程池ThreadPoolExecutor详解

线程池ThreadPoolExecutor设计架构&源码分析

为什么要使用线程池 线程是系统资源,多线程技术主要是为了合理利用cpu的并行处理能力(cpu的快速切换以及多核心),但是创建和销毁线程的开销还是比较耗费时间的,如果系统频繁地创建和销毁线程,那么会造成资源的大量浪费(线程也是一种计算机资源)。 线程池技术就是为了减少线程的创建和销毁,降低资源消耗,提高响应速度。而且线程池的引入,也为管理线程提供了入口,我们可以为线程池指定上限(当然也有无界...

ConcurrentHashMap的高并发和线程安全

ConcurrentHashMap的数据结构和线程安全实现

为什么需要ConcurrentHashMap 在不需要线程安全的情况下,HashMap可以轻松满足我们的日常需求。但是HashMap是线程不安全的,在jdk1.8之前,多线程并发调用put方法,引发扩容,触发resize的过程,因为是链表的关系,甚至有几率形成死循环。(参考资料)。jdk1.8中,采用了复制的方法,而不是操作原链,不会再出现死循环的情况。 HashMap并不是并发容器,在并...

HashMap中的Hash冲突解决和扩容机制

解决Hash冲突的常见实现方法,HashMap的解决冲突和扩容机制

关于HashMap HashMap根据key的hash值来存储数据,HashMap最多只允许一个key为null的记录。HashMap是线程不安全的。HashMap的数据结构是:数组+链表+红黑树(JDK1.8增加了红黑树部分)。 HashMap中的几个关键属性如下: //hash表 transient Node<K,V>[] table; trans...

TreeSet、HashSet、LinkedHashSet的区别

三个Set的区别和代码实现

Set接口 TreeSet、HashSet、LinkedHashSet都实现了Set接口。Set接口和List接口一样继承自Collection接口。 List和Set的区别 关于list,jdk中的描述是这样的:An ordered collection (also known as a <i>sequence</i>).Unlike sets, lists t...