- 博客(49)
- 收藏
- 关注
原创 Netty性能利器 详解时间轮HashedWheelTimer
Netty 中有很多场景依赖定时任务实现,比较典型的有客户端连接的超时控制、通信双方连接的心跳检测等场景。JDK实现的定时任务难以满足Netty的性能要求,为了实现高性能的定时任务调度,Netty 引入了时间轮算法驱动定时任务的执行。本文将简单回顾JDK定时任务的实现,剖析时间轮原理,以及Netty是如何实现时间轮算法。
2023-03-21 20:14:33 1929
原创 Netty性能利器 从ThreadLocal到FastThreadLocal
Netty作为高性能的网络通信框架,在jdk的基础上,做很多的基础工具的优化。本篇介绍Netty对ThreadLocal的改进版,FastThreadLocal。看看FastThreadLocal如何做到高性能。
2021-08-11 21:10:37 289
原创 jdk源码阅读 ReentrantLock ReentrantReadWriteLock
1. java主流的锁在存在数据竞争的场景下,经常要用到锁。除了语言层面的synchronized关键字,java还在jdk里提供了功能丰富的锁相关api。锁相关的概念有很多,synchronized关键字的特性可以想到 自旋,偏向锁,轻量级锁,重量级锁。ReentrantLock则实现公平锁&非公平锁、可重入锁&非可重入锁,ReentrantReadWriteLock还实现共享锁和独占锁。java锁的概念如下图:与synchronized的相关锁概念,如锁消除,锁粗化,自旋锁,偏
2021-01-19 14:57:01 202
原创 Dubbo源码阅读——过滤器链
对于rpc框架,过滤器肯定是需要支持的。Dubbo中的过滤器和web应用的过滤器概念是一样的,提供服务调用前后插入自定义逻辑的途径,可针对所有调用,也可针对部分服务的调用,Dubbo提供灵活的配置。
2020-07-05 16:33:49 363
原创 Dubbo源码阅读——负载均衡
在分布式系统中,负载均衡是非常常用的技术手段。它的职责是将大量的网络请求或者其他形式的负载均匀分布到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消费者的调用请求进行分配,避免少数服务提供者负载过大。Dubbo 提供了4种负载均衡实现,分别是基于权重随机算法的 RandomLoadBalan...
2020-05-15 21:35:46 1295
原创 Dubbo源码阅读——集群容错
本节介绍集群容错部分总体内容,包括服务字典(Directory)、集群容错策略(Cluster)、服务路由(Router)、负载均衡(LoadBalance),以及这几部分内容的关键方法和调用时机。然后详细解读了集群容错策略部分的源码
2020-01-13 17:18:12 1601
原创 Dubbo源码阅读——服务暴露
Dubbo框架使用方式一般是分为两类应用(application):服务提供者(我把它成为p端应用)和服务消费者(c端应用),他们的联系可以是直连,也可以是通过注册中心做服务治理。每个application可以包含多支服务或多个引用。本文通过阅读源码理清服务暴露的全过程。
2019-11-29 23:19:29 867
原创 使用Redis实现分布式锁
在分布式系统中,操作不同系统或者同系统不同主机的共享资源时,为了保持一致性,就需要用到分布式锁。分布式锁有很多种实现方方法,比如zookeeper,redis等等。作为分布式系统的指挥官,用zookeeper实现分布式锁是很合适的,但本文讨论用Redis的setnx指令特性实现分布式锁。Redis的应用场景非常广泛,这种分布式锁的实现方式也非常的常用。
2019-11-29 22:21:02 780
原创 Dubbo源码阅读——dubbo配置解析原理
dubbo的配置解析过程集成了spring框架的能力,本文介绍dubbo的几种配置方式,配置项,配置方式优先级,配置项属性优先级,以及从xml配置方式解读dubbo解析dubbo标签的源码,深入理解dubbo配置解析的详细细节和设计模型。
2019-11-29 22:12:23 1002
原创 Dubbo源码阅读——扩展机制 Dubbo SPI
文章目录一、SPI简介1.JDK SPI2.Dubbo SPI二、Dubbo 扩展点机制源码阅读1.ExtensionLoader的属性2.getExtensionLoader()方法获取加载器实例3.getExtension()方法获取扩展点的实现类实例getExtension()createExtension()一、SPI简介一套成熟的框架在扩展性方面必然需要完备,duboo扩展点加载机制...
2019-11-29 22:11:31 1044
原创 详解单例模式及性能比较
单例模式是java中广泛运用的一种设计模式。单例模式的基本原则是一个类对外只提供一个实例,单例对象只会被初始化一次。实现单例的基本思想是构造函数私有化,自己构造一个实例,对外暴露实例的get方法。它的写法多种多样,下面就介绍单例模式的饿汉式、懒汉式、双重检测锁、静态内部类、枚举这5种写法。并从线程安全、反射漏洞、反序列化漏洞三个方面进行分析优化。最后测试各写法的性能。一、单例的5种写法饿汉式...
2019-10-24 09:53:04 1237
原创 git详细教程
作为一套内容寻址文件系统,Git 不仅仅是一个版本控制系统,它同时是一个非常强大且易用的工具。git已经是开发人员必备技能,也是世界上最先进的分布式版本控制系统,许多公司普遍使用基于git的代码托管网站。有名的代码托管网站有github、gitlab、bitbucket、gitee(码云)。各种git图形化工具也是层出不穷,eclipse、idea等IDE软件也都集成了git插件,但是使用图形化工具的同时,也必须理解git命令及git版本控制原理。
2019-09-18 16:31:26 1987 1
原创 手写一个简单的RPC框架
运用socket、bio、动态代理、线程池、反射等基本知识点,手写一个简单的RPC框架,实现RPC的基本功能,远程过程调用。
2019-07-10 19:13:03 1178 1
原创 池化技术原理,手写数据库连接池
池化技术在后端开发中应用非常广泛,有数据库连接池,线程池,对象池,常量池等。池化技术的出现是为了提高性能。实际就是对一些使用率较高,且创建销毁比较耗时的资源进行缓存,避免重复地创建和销毁,做到资源回收利用
2019-07-01 12:54:45 942
原创 JDK源码阅读,手写HashMap
HashMap是jdk提供的最常用的容器之一,jdk 1.7及之前版本,HashMap底层基于数组和单链表结构,数组每个元素是一对键值对对象,该对象包括hash值,key,value以及单链表下一个键值对的引用。jdk 1.8对HashMap底层结构做了一些改进,当数组同一位置的键值对超过8个,不再以单链表形式存储,而是改为红黑树。进一步提升了性能。
2019-06-24 13:48:12 459
原创 运用JDK动态代理实现拦截器
AOP编程(面向切面编程)的原理是动态代理模式,目标对象实现接口时使用JDK动态代理,没有实现接口时使用cglib动态代理。拦截器的实现就是一种面向切面编程的典型。程序设计者设计一个拦截器接口供开发者使用,开发者只要知道拦截器接口的方法、含义和作用即可,无需知道具体实现。
2019-06-18 10:48:11 743
原创 虚拟机的锁优化技术
为了解决并发操作时的数据一致性问题,java提供锁机制,通过互斥同步或非阻塞同步来保证线程安全。但只要是同步,就会对程序的执行效率产生影响。从JDK1.6开始,HotSpot虚拟机实现了各种锁优化技术,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等。这些技术使得线程之间可以更高效地共享数据,解决竞争问题,从而提高程序执行效率。
2019-03-12 20:04:29 556
原创 深入理解“重载”与“重写”——分派
java语言虽不是动态类型语言,但它具有动态特性,方法重写是java语言动态特性的一个重要因素。本文将从虚拟机层次去理解方法重载和方法重写的实现原理。
2019-03-10 18:37:52 461
原创 JDK源码阅读,手写AtomicInteger
关于java并发的三大特性,原子性、可见性、有序性关乎线程安全问题的基本原理,JDK提供java.util.concurrent.atomic包来对数据类型进行包装,以实现各数据类型的原子性操作
2019-02-24 16:40:23 199
原创 GC算法与垃圾收集器
垃圾自动回收机制是java语言相比c++的一大特性,但垃圾收集并不是java语言的伴生物,GC的历史比java更加久远。为什么我们要了解GC和内存分配呢,当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统达到更大并发量的瓶颈时,我们就需要对垃圾自动回收机制进行调优。
2019-02-13 09:51:01 1043
原创 GC前,判断对象是否死亡
垃圾自动回收机制是java语言相比c++的一大特性,但垃圾收集并不是java语言的伴生物,GC的历史比java更加久远。为什么我们要了解GC和内存分配呢,当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统达到更大并发量的瓶颈时,我们就需要对垃圾自动回收机制进行调优。
2019-02-12 13:39:59 248
原创 RabbitMQ简介与应用
RabbitMQ是一个由ERlang语言开发的基于AMQP(高级消息队列协议)标准的消息队列开源实现。RabbitMQ最初起源于金融系统,用于分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面有很好的表现。
2018-12-26 20:07:57 234
原创 设计一个简单的消息队列
由于分布式系统的广泛应用,越来越多地涉及到系统间通信。系统间通信一般有两种方式,一种是基于远程过程调用的方式,另一种是基于消息队列的方式。基于消息队列的方式是指由应用中的某个系统负责发送消息,由关心这条消息的系统负责接收消息,并在接收到消息后进行各自的业务处理。
2018-11-28 10:39:45 5060 3
原创 SQL优化的一般步骤
在MySQL数据库中,当面对一个有sql性能问题的数据库时,我们可以使用show status、explain、show profile等命令进行系统分析,尽快定位问题SQL并解决问题。一、通过show status命令了解各种SQL的执行情况mysql> show status like 'Com_%';+---------------------------+-------+| ...
2018-10-23 17:44:54 2257
原创 MySQL常用数值函数
在Mysql数据库中,函数可以用在SELECT语句及其子句(例如 WHERE、ORDER BY、HAVING等)中,也可以用在UPDATE、DELETE语句及其子句中。函数包括字符串函数、数值函数、时间日期函数和流程函数等。
2018-09-12 22:27:24 2147
原创 MySQL常用字符串函数
在Mysql数据库中,函数可以用在SELECT语句及其子句(例如 WHERE、ORDER BY、HAVING等)中,也可以用在UPDATE、DELETE语句及其子句中。函数包括字符串函数、数值函数、时间日期函数和流程函数等。
2018-09-12 17:27:31 1140
原创 深入理解volatile关键字
volatile是一个非常重要的关键字,用来修饰实例变量和类变量,以保证线程安全。想理解它的底层原理需先认识JVM内存模型和CPU缓存模型相关知识。
2018-09-10 23:56:37 831
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人