- 博客(85)
- 收藏
- 关注
原创 java阻塞队列底层实现原理
阻塞队列,常应用到生产者和消费者模型下,针对java内置的阻塞队列,具体的原理,存储结构,并发控制,本文进行分析和梳理一下。
2024-08-15 18:32:03
517
原创 《Redis设计与实现》读书笔记-复制
在redis 通过向从服务器发送命令:SLAVE OF,让从服务器复制主服务器,成为复制。复制的目的 让从服务器与主服务器数据保持一致。部分重同步通过复制偏移量、复制积压缓冲区、服务器运行 ID 三个部分来实现,重点解决断线重连全量复制的低效问题。在复制操作刚开始的时候,从服务器会成为主服务器的客户端,并通过向主服务器发送命令请求来执行复制步骤,而在复制操作的后期,主从服务器会互相成为对方的客户端。
2024-08-07 17:56:44
1066
原创 kafka leader选举过程浅析
kafka我们都知道它是通过副本机制,来支持负载均衡和故障转移等高可用的,那么具体副本的选举过程你了解吗?下面我们一起来学习下吧!
2024-07-29 18:31:20
667
原创 《Redis设计与实现》读书笔记-客户端
Redis 服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由1/0多路复用技术实现的文件事件处理器,Redis 服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/
2024-07-29 10:59:39
2453
1
原创 kafka高性能的底层原理分析
以上是从整体上总结了kafka支持高性能的6点原因,我们先从宏观上有个清晰的认知具体每个原因的具体内部技术细节,后期会慢慢给大家分析。
2024-07-27 14:48:31
442
原创 【高频面试题】java实现堆排序算法
将待排序的数组元素构建成一个最大堆(或最小堆) 从最后一个非叶子节点开始,向上调整每个子树,使其成为一个最大堆。堆调整将交换后的新堆顶元素向下调整,使其重新成为一个最大堆。重复:持续进行以上步骤,直到堆的大小减少到1。每次调整的复杂度是 O(log n),共需要 n 次调整,所以总时间复杂度是 O(n log n)。将最后元素 与 堆顶值 交换,这样最大元素就在数组的末尾。
2024-07-26 22:30:22
240
原创 《Redis设计与实现》读书笔记-一条命令执行过程
一个命令请求从发送到获得回复的过程中,客户端和服务器需要完成一系列操作。举个例子,如果我们使用客户端执行以下命令:OK那么从客户端发送 SET KEY VALUE 命令到获得回复OK 期间,客户端和服务器共需要1)客户端向服务器发送命令请求 SET KEY VALUE。2)服务器接收并处理客户端发来的命令请求 SET KEY VALUE,在数据库中进行设置操作,并产生命令回复OK。3)服务器将命令回复 OK 发送给客户端。4)客户端接收服务器返回的命令回复OK,并将这个回复打印给用户观看。
2024-07-26 14:28:34
979
原创 《Redis设计与实现》读书笔记-数据结构(SDS)
《Redis设计与实现读书笔记》系列文章笔者深度阅读,高度提纯后的读书笔记,能快速了解内部原理
2024-07-26 12:19:17
264
原创 JVM是如何处理异常的
众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。抛出异常可分为显式和隐式两种。显式抛异常的主体是应用程序,它指的是在程序中使用“throw”关键字,手动将异常实例抛出。隐式抛异常的主体则是 Java 虚拟机,它指的是 Java 虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常。举例来说,Java 虚拟机在执行读取数组操作时,发现输入的索引值是负数,故而抛出数组索引越界异常(ArrayIndexOutOfBoundsException)。捕获异常则
2021-03-14 15:21:09
359
原创 JVM是如何执行方法调用的?(下)
这个 Idea 究竟是什么呢,我们知道,设计模式大量使用了虚方法来实现多态。但是虚方法的性能效率并不高,所以我就说,是否能够在此基础上写篇文章,评估每一种设计模式因为虚方法调用而造成的性能开销,并且在文章中强烈谴责一下?当时呢,我老板教的是一门高级程序设计的课,其中有好几节课刚好在讲设计模式的各种好处。所以,我说完这个 Idea,就看到老板的神色略有不悦了,脸上写满了“小郑啊,你这是舍本逐末啊”,于是,我就连忙挽尊,说我是开玩笑的。在这里呢,我犯的错误其实有两个。第一,我不应该因为虚方法的性能效率,而放弃良
2021-03-14 14:35:05
212
原创 JVM是如何执行方法调用的?(上)
前不久在写代码的时候,我不小心踩到一个可变长参数的坑。你或许已经猜到了,它正是可变长参数方法的重载造成的。(注:官方文档建议避免重载可变长参数方法,见[1]的最后一段。)void invoke(Object obj, Object... args) { ... }void invoke(String s, Object obj, Object... args) { ... }invoke(null, 1); // 调用第二个invoke方法invoke(null, 1, 2); // 调用
2021-03-14 14:27:12
219
原创 Java虚拟机是如何加载Java类的?
从 class 文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三大步骤。其中,链接过程中同样需要验证;而内存中的类没有经过初始化,同样不能使用。那么,是否所有的 Java 类都需要经过这几步呢?我们知道 Java 语言的类型可以分为两大类:基本类型(primitive types)和引用类型(reference types)。在上一篇中,我已经详细介绍过了 Java 的基本类型,它们是由 Java 虚拟机预先定义好的。至于另一大类引用类型,Java 将其细分为四种:类、接口、数组类和泛型参数。
2021-03-14 14:08:00
183
原创 java虚拟机基本原理系列-java代码如何运行的?
java代码如何运行的?Java 代码有很多种不同的运行方式。1、比如说可以在开发工具中运行,2、双击执行 jar 文件运行,3、命令行中运行,4、可以在网页中运行当然,这些执行方式都离不开 JRE,也就是 Java 运行时环境。实际上,JRE 仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。我们 Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。然而,运行 C++ 代码则无需额外的运行时
2021-03-14 13:50:09
50
原创 redisTemplate-executePipelined使用
redisTemplate-executePipelined使用好处:使用Pipeline可以批量执行redis命令,防止多个命令建立多个连接读取:List list = redisTemplate.executePipelined((RedisCallback) connection -> {keyList.forEach(key -> connection.get(redi...
2019-08-28 11:47:08
18010
1
原创 深入浅出面向对象分析-解决大问题
面对一个复杂的系统,如何运用面向对象的设计思想将系统设计成易维护,可扩展是一件比较有挑战的事情。如何解决系统大问题聆听客户,找出他们需要你构建什么。用客户能理解的语言组合功能列表。确认你描述的功能,是客户真正想要的。运用用例图(以及用例)创建系统蓝图。将系统分解成许多较小的部分。将设计模式运用到系统中较小的部分。运用基本的OOA&D为每一个较小的部分设计程序。...
2018-09-14 23:30:27
425
原创 java死锁demo
package com.thread;/** * @Author madongxu * @Date 2018-04-27 */public class DeadLock { public static void main(String[] args) { final DeadObject deadObject1 = new DeadObject(1);...
2018-07-02 12:21:33
537
原创 线上cpu负载过高问题排查
问题场景: 生产故障-JVM进程CPU占用率高于100%。 某日,运维同学反馈生产环境有故障,某个JVM进程CPU负载一直居高不下。登入服务器用 top -c 命令查看进程情况。 定位故障的思路: - 通过Top -c命令查看进程信息,找出问题进程内负载过高的线程id - 在通过jstack命令查到对应的线程,定位到代码 具体步骤top -Hbp 进程id ;-H:查看进...
2018-04-29 23:44:26
1335
原创 java线程之间状态转换详解
在并发编程中,使用多线程则是一个程序员必备的技能之一,那么今天总结下线程的状态有哪些,以及怎样转换的。 java定义了5种线程状态,在任意一个时间点,一个线程只能有且只有其中的一种状态,5中状态如下:新建(New):创建线程后尚未启动的线程。运行(Runnable):包括了OS线程状态中的Running和Ready,即该状态下线程可能正在运行,也可能在等待cpu的为他分配时间。...
2018-04-27 12:06:43
344
原创 单例模式之线程安全
在设计模式中单例模式,相信大家都很熟悉了,并在系统的场景中都有不少的应用,主要设计思路:保证某个类的实例的引用在jvm中有且仅有一份,但在多线程并发中如何保证线程安全呢,请看代码,仅供参考/** * @Author madongxu * @Date 2018-04-27 * 线程安全的单利模式 */public class SingleTon { //可见性的类实例变量...
2018-04-27 11:39:09
229
原创 早期(编译期)优化笔记
本次主要分享下关于,java的编译期优化方面的知识,其实是一个不确定的操作过程,因为“编译期间”又可以继续细分为“前期”(.java编译为*.class文件过程);“后期”:JIT编译器把字节码转变为机器码的过程;“静态提前编译”:直接将java文件编译为本地代码过程。jvm解析java文件时,主要进行了如下步骤:词法:将源代码的字符流转变为标记(Token)集合,单个字符是程序编...
2018-04-27 11:25:33
279
原创 java实现冒泡算法
冒泡算法是每趟比较相邻两个元素,如果前一个大于后一个则交换,若n个元素则需要比较n-1趟; java代码:public static void sort(int[] arr, int num) { //经过多少躺排序 for (int p = num - 1; p > 0; p--) { int flag = 0; ...
2018-04-25 14:13:43
1106
1
转载 Redis实现分布式锁
分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时...
2018-04-25 01:56:51
356
转载 Zookeeper实现分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开。我们来看下使用Zookeeper如何实现分布式锁。 什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理、分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功能而且...
2018-04-25 01:47:43
319
原创 java可重入锁模版代码
java使用可重入锁中,一般通用的代码写法:/** * @Author madongxu * @Date 2018-04-24 * 可重入锁使用一般的模版代码 */public class ReentrantLockTemplate { //默认是不公平锁类型// final ReentrantLock lock = new ReentrantLock(); ...
2018-04-24 15:21:34
417
原创 JAVA读写锁ReentrantReadWriteLock学习笔记1
java中保证多线程共享数据的方式除了 synchronized之外,还可以 使用可重入锁,而读写锁ReentrantReadWriteLock,在多线程并发时,读多写少的场景下,可以提高并发行,这是相对于ReentrantLock来讲。 读锁:多线程共享 写锁:线程独占 锁降级:即写锁可以降级为读锁; 锁降级步骤: 1.当前线程T已经获得写锁,T线程先获得读锁, 2.T再释放写锁,按...
2018-04-24 14:34:13
237
转载 java-concurrentHashMap学习笔记1
在java中,hashmap是非同步的,而hashtable和Collections.SynchronizedHashMap()来包装hashmap的效率不高,因为使用了同步关键字在整个map容器中。而ConcurrentHashMap的并发性能更高,因为在内部,将hashtable表分解为多个segment,并在每个segment上使用锁分段技术,使用多个锁来提升并发性能。 Concurr...
2018-04-23 21:53:36
222
原创 MYQL查询优化笔记2
下面说一下mysql查询优化的一些方法和技巧 一.查询慢的原因: 1.查询不需要的记录,如查询100条数据,结果应用程序仅仅使用前10条,mysql是先返回全部结果集然后在计算;这样使用limit来解决。 2.多表关联时候返回全部列 3.总是取回全部的列,如:select * from table 4.多次重复查询相同的数据 二.是否扫描额外的记录 对于mysql来衡量查询开销的指标...
2018-04-23 21:51:58
186
原创 java多线程同步和通信
java多线程之间互斥的一种方式是使用sychronized来修改被多线程访问的代码; 而线程之间进行同步有序的进行时,可以使用wait(),notify()方法来实现 例如:子线程运行10次,主线程运行100次,子线程运行10次,主线程在运行100次,循环共50次。package com.thread;/** * @Author madongxu * @Date 2018-0...
2018-04-23 14:34:02
315
原创 JAVA实现快速排序算法
今天主要总结下快速排序算法相关内容。 快速排序算法,利用分治法(递归)的来进行排序,如对一个int[] array进行排序时,需要从数组元素中寻找到一个元素来做为参考值(主元),然后以主元为界将数组分为左右2个子数组,并对子数组进行排序,递归的执行分组排序,最后合并所有子数组的元素,则排序完成。 一。主要步骤如下: 1)若排序数组个数少于等于1,则返回 2)选择主元pivot 3)将数组...
2018-04-22 22:09:46
184
原创 Tomcat处理请求过程和重要参数详解
Tomcat处理用户连接请求模式 BIO:阻塞模型 NIO:非阻塞模型 APR:高性能,可扩展的模式,Tomcat8版本默认模式 在使用tomcat时,经常会遇到连接数、线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector)。在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建R...
2018-04-21 16:22:59
2187
原创 电商系统库存设计笔记1
电商系统库存设计场景:比如秒杀品在高并发的情况下如何防止超卖,另外库存系统还不是一个纯技术的系统,需要结合用户的行为特点来考虑,比如下文中提到什么时间进行库存的扣减最合适,我们先抛出几个问题和大家一起探讨下,如有有妥不处,欢迎大家拍砖。 何时库存进行预占(或者扣减)? 商家销售的商品数量是有限的,用户下单后商品会被扣减,我们可以怎么实现呢? 举个例子:一件商品有100个库存,现在有100...
2018-04-20 18:32:44
4259
原创 mysql索引笔记2
聚簇索引:也叫簇类索引,是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。 mysql聚簇索引:并不是索引的一种,是数据存储的一种方式,不同的存储引擎的实现方式不同,在innerDB中使用...
2018-04-02 11:49:07
154
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人