自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ignore

喷子太多,已离开 CSDN

  • 博客(49)
  • 问答 (1)
  • 收藏
  • 关注

原创 编写你的第一个 Java 版 Raft 分布式 KV 存储

前言本文旨在讲述如何使用 Java 语言实现基于 Raft 算法的,分布式的,KV 结构的存储项目。该项目的背景是为了深入理解 Raft 算法,从而深刻理解分布式环境下数据强一致性该如何实现;该项目的目标是:在复杂的分布式环境中,多个存储节点能够保证数据强一致性。项目地址:https://github.com/stateIs0/lu-raft-kv欢迎 star :)什么是 Java 版 ...

2019-01-12 12:51:07 1245 1

原创 如何编写一个 SendFile 服务器

如何编写一个 SendFile 服务器前言之前讨论零拷贝的时候,我们知道,两台机器之间传输文件,最快的方式就是 send file,众所周知,在 Java 中,该技术对应的则是 FileChannel 类的 transferTo 和 transferFrom 方法。在平时使用服务器的时候,比如 nginx ,tomcat ,都有 send file 的选项,利用此技术,可大大提高文件传输效能...

2019-10-29 14:07:06 368

原创 扎心一问:分库分表就能无限扩容吗

前言像我这样的菜鸟,总会有各种疑问,刚开始是对 JDK API 的疑问,对 NIO 的疑问,对 JVM 的疑问,当工作几年后,对服务的可用性,可扩展性也有了新的疑问,什么疑问呢?其实是老生常谈的话题:服务的扩容问题。正常情况下的服务演化之路让我们从最初开始。单体应用每个创业公司基本都是从类似 SSM 和 SSH 这种架构起来的,没什么好讲的,基本每个程序员都经历过。RPC 应用当...

2019-01-16 08:27:24 937 1

原创 Lu-Rpc 更新,支持熔断,限流

唠叨GitHub 地址: https://github.com/stateIs0/Lu-Rpc最近一直在开发一个 mini rpc 系统,支持一些 rpc 常见的功能,例如客户端负载均衡,故障转移,熔断,自适应限流,多通道流量分配,动态配置等等。不过也总算是开发完了,目前已经在线上跑起来了。好了,总算有点点时间来维护一下我的 Lu-Rpc 了。说实话,在开发那个项目的期间,还是有很多思考的...

2018-12-15 12:46:08 919

原创 面试必问!Java 多线程中两个线程交替执行,一个输出偶数,一个输出奇数

前言楼主今天在面经上看到这个题,挺有意思,小小的题目对多线程的考量还挺多。大部分同学都会使用 synchronized 来实现。楼主今天带来另外两种优化实现,让你面试的时候,傲视群雄!第一种 synchronizedclass ThreadPrintDemo2 { public static void main(String[] args) { final Thre...

2018-05-26 01:04:43 2533 7

原创 自己实现一个一致性 Hash 算法

前言在前文分布式理论(八)—— Consistent Hash(一致性哈希算法)中,我们讨论了一致性 hash 算法的原理,并说了,我们会自己写一个简单的算法。今天就来写一个。普通 hash 的结果先看看普通 hash 怎么做。首先,需要缓存节点对象,缓存中的存储对象,还有一个缓存节点集合,用于保存有效的缓存节点。实际存储对象,很简单的一个类,只需要获取他的 hash 值就好: static

2018-03-31 21:40:07 1068

原创 自己用 Netty 实现一个简单的 RPC

目录: 1. 需求 2. 设计 3. 实现 1. 创建 maven 项目,导入 Netty 4.1.16。 2. 项目目录结构 3. 设计接口 4. 提供者相关实现 5. 消费者相关实现 6. 测试结果 4. 总结前言众所周知,dubbo 底层使用了 Netty 作为网络通讯框架,而 Netty 的高性能我们之前也分析过源码,...

2018-03-31 00:07:55 5536 6

原创 并发编程之学习总结

前言楼主自1月14号就停更了,这段时间一直在看JVM,因此没有更新任何文章,但楼主觉得有必要总结一下之前学习并发的过程,因为这一次的总结其实就是下一次的开始。主要时总结一下并发的学习路线,因为在楼主的工作环境中,并不是每天都在编写高并发的程序。然而,即使是这样,我们也要知道并发的每个知识点,这样才算一个合格的Java 程序员。那么如何系统的学习并发呢?学习路线是怎么样的呢?1. 学会开始就成功了一半

2018-01-27 22:26:25 1856

原创 并发编程之 ConcurrentLinkedQueue 源码剖析

前言今天我们继续分析 java 并发包的源码,今天的主角是谁呢?ConcurrentLinkedQueue,上次我们分析了并发下 ArrayList 的替代 CopyOnWriteArrayList,这次分析则是并发下 LinkedArrayList 的替代 ConcurrentLinkedQueue, 也就是并发链表。Demo该类继承结构如下:该类是 Collection 框架下的实现。也就是Ja

2018-01-14 00:26:32 463

原创 并发编程之 AQS 源码剖析

前言JDK 1.5 的 java.util.concurrent.locks 包中都是锁,其中有一个抽象类 AbstractQueuedSynchronizer (抽象队列同步器),也就是 AQS, 我们今天就来看看该类。1.结构我们看看该类的结构,该类被 CountDown,ThreadPoolExecutor,ReentrantLock,ReentrantReadWriteLock,Semap

2018-01-13 19:35:42 525 1

原创 并发编程之 Fork-Join 分而治之框架

前言“分而治之” 一直是一个有效的处理大量数据的方法。著名的 MapReduce 也是采取了分而治之的思想。简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个数据的能力,那么你可以只处理其中的10个,然后,分阶段处理100次,将100次的结果进行合成,那就是最终想要的对原始的1000个数据的处理结果。Fork & Join 的具体含义Fork 一词的原始含义是吃饭用的叉子,也有分

2018-01-11 00:24:24 481

原创 并发编程线程通信之管道流

前言在并发编程中,需要处理两个问题:线程之间如何通信及线程之间如何同步。通知是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。而子啊消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。Java 的并发才作用的是共享内存模型,Java

2018-01-10 20:50:44 367

原创 并发编程之 CopyOnWriteArrayList 源码剖析

前言ArrayList 是一个不安全的容器,在多线程调用 add 方法的时候会出现 ArrayIndexOutOfBoundsException 异常,而 Vector 虽然安全,但由于其 add 方法和 get 方法都使用了 synchronized 关键字,导致在并发时的性能令人担忧,因此,伟大的 Doug Lea 编写了 CopyOnWriteArrayList 并发容器,用于替代并发时的 A

2018-01-10 20:12:05 785

原创 并发编程之 ThreadLocal 源码剖析

前言首先看看 JDK 文档的描述: 该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。 每个线程

2018-01-10 00:15:10 409 2

原创 并发编程之 LinkedBolckingQueue 源码剖析

前言JDK 1.5 之后,Doug Lea 大神为我们写了很多的工具,整个 concurrent 包基本都是他写的。也为我们程序员写好了很多工具,包括我们之前说的线程池,重入锁,线程协作工具,ConcurrentHashMap 等等,今天我们要讲的是和 ConcurrentHashMap 类似的数据结构,LinkedBolckingQueue,阻塞队列。在生产者消费者模型中,该类可以帮助我们快速的实

2018-01-08 23:51:16 494

原创 并发编程之 CAS 的原理

前言在并发编程中,锁是消耗性能的操作,同一时间只能有一个线程进入同步块修改变量的值,比如下面的代码synchronized void function(int b){ a = a + b;}如果不加 synchronized 的话,多线程修改 a 的值就会导致结果不正确,出现线程安全问题。但锁又是要给耗费性能的操作。不论是拿锁,解锁,还是等待锁,阻塞,都是非常耗费性能的。那么能不能不加锁呢?

2018-01-07 23:15:27 1094

原创 并发编程之 锁的优化有哪些

前言在 JDK 1.6 之前,synchronized 性能令人担忧,但是 1.6 之后,JVM 团队针对 synchronized 做了很多的优化,让 synchroized 在性能层面相比较 ReentrantLock 不相上下。那么,JVM 团队做了哪些优化呢?首先说,怎么才能优化?我们知道,“锁” 其实是互斥同步的具体实现,而互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需

2018-01-07 21:38:27 781

原创 并发编程之 ConcurrentHashMap(JDK 1.8) putVal 源码分析

前言我们之前分析了Hash的源码,主要是 put 方法。同时,我们知道,HashMap 在并发的时候是不安全的,为什么呢?因为当多个线程对 Map 进行扩容会导致链表成环。不单单是这个问题,当多个线程相同一个槽中插入数据,也是不安全的。而在这之后,我们学习了并发编程,而并发编程中有一个重要的东西,就是JDK 自带的并发容器,提供了线程安全的特性且比同步容器性能好出很多。一个典型的代表就是 Concu

2018-01-07 17:15:31 1133 2

原创 并发编程之 源码剖析 线程池 实现原理

前言在上一篇文章中我们介绍了线程池的使用,那么现在我们有个疑问:线程池到底是怎么实现的?毕竟好奇是人类的天性。那我们今天就来看看吧,扒开 他的源码,一探究竟。1. 从 Demo 入手上图是个最简单的demo,我们从这个 demo 开始看源码,首先一步一步来看。首先我们手动创建了线程池,使用了有数量限制的阻塞队列,使用了线程池工厂提供的默认线程工厂,和一个默认的拒绝策略,我们看看默认的线程工厂是如何创

2018-01-05 22:40:44 459

原创 并发编程之线程池的使用及扩展和优化

前言多线程的软件设计方法确实可以最大限度的发挥现代多核处理器的计算能力,提高生产系统的吞吐量和性能。但是,如果一个系统同时创建大量线程,线程间频繁的切换上下文导致的系统开销将会拖慢整个系统。严重的甚至导致内存耗尽导致OOM异常。因此,在实际的生产环境中,线程的数量必须得到控制,盲目的创建大量新车对系统是有伤害的。那么,怎么才能最大限度的利用CPU的性能,又能保持系统的稳定性呢?其中有一个方法就是使用

2018-01-04 22:32:29 1937

原创 并发编程之 线程协作工具 LockSupport

前言在前面的文章中,我们介绍了并发工具中的4个,Samephore,CyclicBarrier,CountDownLatch,Exchanger,但是我们漏了一个,非常的好用的工具,楼主在这里必须加上。LockSupportLockSupport 是一个非常方便实用的线程阻塞工具,他可以在任意位置让线程阻塞。并且是静态的方法。是不是很心动?LockSupport 的静态方法 park()可以阻塞当前

2018-01-04 00:35:23 328

原创 并发编程之 线程协作工具类

前言在并发编程的时候,Doug Lea 大师为我们准备了很多的工具,都在 JDK 1.5 版本后的java.util.concurrent 包下,今天楼主就和大家分享一些常用的线程协作的工具。Semaphore 信号量CountDownLatch 倒计时器CyclicBarrier 循环栅栏Exchanger 交换器1. Semaphore 信号量我们在上一篇文章中说到了3把锁,无论是 s

2018-01-03 23:25:21 387

原创 并发编程之 Java 三把锁

前言今天我们继续学习并发。在之前我们学习了 JMM 的知识,知道了在并发编程中,为了保证线程的安全性,需要保证线程的原子性,可见性,有序性。其中,synchronized 高频出现,因为他既保证了原子性,也保证了可见性和有序性。为什么,因为 synchronized 是锁。通过锁,可以让原本并行的任务变成串行。然而如你所见,这也导致了严重的性能受损。因此,不到万不得已,不要使用锁,特别是吞吐量要求特

2018-01-03 22:02:37 899

原创 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则

前言楼主这个标题其实有一种作死的味道,为什么呢,这三个东西其实可以分开为三篇文章来写,但是,楼主认为这三个东西又都是高度相关的,应当在一个知识点中。在一次学习中去理解这些东西。才能更好的理解 Java 内存模型和 volatile 关键字还有 HB 原则。楼主今天就尝试着在一篇文章中讲述这三个问题,最后总结。讲并发知识前必须复习的硬件知识。Java 内存模型到底是什么玩意?Java 内存模型定

2018-01-03 00:50:11 1000

原创 并发编程之 Thread 类过期方法和常用方法

前言在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费。我们在进行并发必编程的时候一定要注意这些。过期方法1—– stop 方法过期方法2——suspend 方法和 resume 方法常用方法1——线程中断方法 interrupt,isInterrupted,static

2018-01-02 20:23:21 438

原创 并发编程之 wait notify 方法剖析

前言2018 元旦快乐。摘要:notify wait 如何使用?为什么必须在同步块中?使用 notify wait 实现一个简单的生产者消费者模型底层实现原理 1. notify wait 如何使用?今天我们要学习或者说分析的是 Object 类中的 wait notify 这两个方法,其实说是两个方法,这两个方法包括他们的重载方法一共有5个,而Object 类中一共才 12 个方法,可见

2018-01-01 22:49:38 507

原创 深入理解 HashMap put 方法(JDK 8逐行剖析)

前言注意:我们今天所有的一切都是基于 JDK 8,JDK 8 的实现和 JDK 7 有重大区别。前面我们分析了 hashCode 和 hash 算法的原理,其实都是为我们解析 HashMap 做铺垫,因为 HashMap 确实比较复杂(如果你每一行代码都看的话,每个位移都纠结的话),虽然总的来说,HashMap 不过是 Node 数组加 链表和红黑树。但是里面的细节确是无比的优雅和有趣。楼主为什么选

2017-12-31 18:58:47 12984 17

原创 浅显理解 hashcode 和 hash 算法

摘要二进制计算的一些基础知识为什么使用 hashcodeString 类型的 hashcode 方法为什么大部分 hashcode 方法使用 31HashMap 的 hash 算法的实现原理(为什么右移 16 位,为什么要使用 ^ 位异或)HashMap 为什么使用 & 与运算代替模运算?HashMap 的容量为什么建议是 2的幂次方?我们自定义 HashMap 容量最好是多少?前

2017-12-30 23:06:07 57806 27

原创 并发编程之死锁解析

前言在 Java 的并发编程中,有一个问题需要特别注意,那就是死锁,如果发生了死锁,基本就是重启,而重启将会丢失运行中的数据。所以,了解死锁的形成并排查死锁到预防死锁成了一个重要的问题。我们了解任何一个事情的步骤是:what,how,why,why not。1. 什么是死锁?我们还是直接写一段代码来看看:package hello;public class DeadLock { public st

2017-12-29 20:55:46 730

原创 深入理解 Spring 之 SpringBoot 事务原理

前言今天是平安夜,先祝大家平安夜快乐。我们之前的数十篇文章分析了 Spring 和 Mybatis 的原理,基本上从源码层面都了解了他们的基本原理,那么。在我们日常使用这些框架的时候,还有哪些疑问呢?就楼主而言,楼主已经明白了 IOC ,AOP 的原理,也明白了 Mybatis 的原理,也明白了 Spring 和 Mybatis 是如何整合的。但是,我们漏掉了 JavaEE 中一个非常重要的特性:事

2017-12-25 11:48:19 53682 9

原创 深入剖析 mybatis 原理(四)插件的原理和应用

mybatis 插件原理

2017-12-22 20:51:56 1141 1

原创 深入剖析 mybatis 原理(三)如何整合Spring

# 前言在前两篇文章我们在 mybatis 源码中探究了他的运行原理,但在实际使用中,我们需要将其和Spring整合使用,特别是当下流行的SpringBoot,那么,myBatis 在 SpringBoot 中是如何运行的呢?我们需要带着问题去研究,这样才能印象更深刻,以下是楼主的问题,不知道各位有没有自己的问题,如果有,也可以和楼主一起探讨,或者自己查看源码。

2017-12-19 20:52:08 1056

原创 深入剖析 mybatis 原理(二)

分析了mybait 的 Mapper 原理。

2017-12-17 14:58:06 1247 2

原创 深入剖析 mybatis 原理(一)

# 前言在java程序员的世界里,最熟悉的开源软件除了 Spring,Tomcat,还有谁呢?当然是 Mybatis 了,今天楼主是来和大家一起分析他的原理的。

2017-12-17 13:13:53 15934 5

原创 深入理解Spring 之 Spring 进阶开发必知必会 之 Spring 扩展接口

# 前言我们在前几篇文章中已经深入了解了 Spring 的 IOC 机制和 AOP 机制,现在我们可以看看Spring留给我们的扩展接口。

2017-12-13 18:17:15 11615 3

原创 深入理解Spring 之 源码剖析 SpringBoot Aop 切面编织过程和代理执行过程

分析 SpringBoot AOP 原理

2017-12-11 19:09:26 7264 4

原创 深入理解Spring 之 源码剖析AOP(注解方式)

分析 Spring AOP 通过注解方式如何创建代理的。

2017-12-09 15:42:31 1412 2

原创 深入理解Spring 之 源码剖析AOP(XML配置方式)

Spring AOP 介绍

2017-12-07 23:49:11 1345

原创 自己动手实现一个简单的 IOC

再上一篇文章中,楼主和大家一起分析spring的 IOC 实现,剖析了Spring的源码,看的出来,源码异常复杂,这是因为Spring的设计者需要考虑到框架的扩展性,健壮性,性能等待元素,因此设计的很复杂。楼主在最后也说要实现一个简单的 IOC,让我们更加深刻的理解IOC,因此,有了这篇文章。当然我们是仿照Spring 的 IOC,因此代码命名和设计基本是仿照spring的。我们将分为几步来编写简易

2017-12-05 20:10:52 2391 2

原创 深入理解 Spring 之源码剖析IOC

作为Java程序员,Spirng我们再熟悉不过,可以说比自己的女朋友还要亲密,每天都会和他在一起,然而我们真的了解spring吗?我们都知道,Spring的核心是IOC和AOP,但楼主认为,如果从这两个核心中挑选一个更重要的,那非IOC莫属。AOP 也是依赖于IOC,从某些角度讲,AOP就是IOC的一个扩展功能。什么是IOC? IOC解决了什么问题?IOC的原理是什么?Spring的IOC是怎么实现

2017-12-04 23:11:39 2715 4

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除