java
文章平均质量分 91
一只经常emo的程序员
非淡泊无以明志,非宁静无以致远
展开
-
JAVA 中间件之 Mycat2
官网:Mycat 是基于 java 语言编写的数据库,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。原创 2024-04-27 15:29:36 · 1115 阅读 · 0 评论 -
分布式之RabbitMQ
百度百科:RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。首先RabbitMQ基于AMQP协议开发,所以很多基于AMQP协议的功能RabbitMQ都是支持的,比如SpringCloud中的消息总线bus。原创 2024-04-24 07:00:00 · 813 阅读 · 1 评论 -
Spring框架之WebFlux
根据前面的代码,第一个发出的事件必须是与订阅相关的事件,紧跟其后的事件必须是 foo 和bar 字符串。最后, StepVerifier#expectCompletion 定义终止信号的存在。在此例中,必须是 Subscriber#onComplete 的调用,或者成功完成给定的 Flux。要执行验证,或者说对创建流进行订阅,就必须调用 .verify() 方法。verify() 是一个阻塞调用,它阻塞执行,直到流发出所有预期的事件。原创 2024-04-02 07:00:00 · 775 阅读 · 0 评论 -
数据库之MyBatisPlus详解
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。原创 2024-03-31 10:17:22 · 1116 阅读 · 0 评论 -
mysql之MyBatis核心工作原理
接下来我们就开始MyBatis的源码之旅,首先大家要从宏观上了解Mybatis的整体框架分为三层,分别是基础支持层、核心处理层、和接口层。如下图然后根据前面讲解的MyBatis的应用案例,给出MyBatis的主要工作流程图在MyBatis的主要工作流程里面,不同的功能是由很多不同的类协作完成的,它们分布在MyBatis jar包的不同的package里面。大概有一千多个类,这样看起来不够清楚,不知道什么类在什么环节工作,属于什么层次。原创 2024-03-30 07:00:00 · 1390 阅读 · 2 评论 -
spring安全框架之Shiro
Shiro是基于Java语言编写的,Shiro最核心的功能就是认证和授权。Shiro官方:http://shiro.apache.orgShiro的核心架构图仿照JdbcRealm实现一个自定义的Realm对象声明POJO类,继承AuthorizingRealm……………………重写doGetAuthenticationInfo方法(认证)/*** 认证方法,只需要完成用户名校验即可,密码校验由Shiro内部完成* @param token 用户传入的用户名和密码* @return*/原创 2024-03-28 07:00:00 · 866 阅读 · 0 评论 -
Dubbo详解
Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。原创 2024-03-26 07:00:00 · 762 阅读 · 1 评论 -
分布式之缓存详解
时效式清理+数目阈值:防止:短期内,密集查询,导致缓存空间的急剧增大。–自己的完整思路。lru+软引用:保证热数据,最大限度的提高 缓存命中率,p。不建议:仅仅使用 软引用。因为我们失去了对它的控制。目的:提高缓存命中率,节省空间,=》提升性能。在系统中,每增加一个环节,就多一份风险。用是不得已。遇到风险,分析原因,解决之。原因:更新机制,清理机制。原创 2024-03-25 21:38:53 · 1422 阅读 · 0 评论 -
分布式锁简单实现
想要实现分布式锁,必须要求 Redis 有「互斥」的能力,我们可以使用 SETNX 命令,这个命令表示SET if Not Exists,即如果 key 不存在,才会设置它的值,否则什么也不做。上面的命令执行时,每个客户端在释放锁时,都是「无脑」操作,并没有检查这把锁是否还「归自己持有」,所以就会发生释放别人锁的风险,这样的解锁流程,很不「严谨」!如何解决这个问题呢?此时,加锁成功的客户端,就可以去操作「共享资源」,例如,修改 MySQL 的某一行数据,或者调用一个 API 请求。怎么解决这个问题呢?原创 2024-03-22 07:00:00 · 2754 阅读 · 0 评论 -
分布式之Skywalking
Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint /CAT 的设计思路。特点是:支持多种插件,UI功能较强,支持非侵入式埋点。目前使用厂商最多,版本更新较快。数据存储支持:Elasticsearch、MySQL、H2、TiDB。默认是H2,而且是存到内存。实际我们一般将其存到ES。主页:http://skywalking.apache.org/原创 2024-03-21 07:00:00 · 1021 阅读 · 0 评论 -
分布式之Sleuth&Zipkin
现存问题是什么?Sleuth&Zipkin:SpringCloud中的一个组件,专门链路追踪SkyWalking:Apache组织下的一个开源框架,并且是个顶级项目阿里鹰眼:没玩过~~美团Cat:没玩过~~Sleuth&Zipkin对比SkyWalking相同点,都是链路追踪框架Sleuth是收集信息,Zipkin是图形化展示。SkyWalking一锅端~~SkyWalking的报表展示比Sleuth&Zipkin更丰富。原创 2024-03-20 21:50:56 · 1220 阅读 · 0 评论 -
Java并发编程之ReactiveSteams
在聊Reactive Steams之前,先了解一下Reactive Programming(反应式/响应式编程)。为了解决异步编程中出现的各种问题,程序员们提出了各种的思路去解决这些问题,这些解决问题的方式,方法,手段就可以叫做Reactive Programming。Reactive Programming是一种编程思想,类似面向对象,函数式编程。本质上是对数据流或某种变化做出的反应,这个变化什么时候触发是未知的,所以他是一种基于异步、回调的方式在处理问题。原创 2024-03-19 07:00:00 · 1023 阅读 · 4 评论 -
JAVA对象内存模型
JDK1.6出现的 开启了指针压缩 什么时候指针压缩会无效??超过32G指针压缩无效:便于数据之间的类型转换,例如:long类型转换为int类型时,高地址部分的数据可以直接截掉。原创 2024-03-02 07:00:00 · 604 阅读 · 2 评论 -
JVM常用命令
当超过一定的时间限度,如果方法的调用次数仍然不足以让它提交给即时编译器编译,那么这个方法的调用计数器就会被减少一半,这个过程称为方法调用计数器热度的衰减(Counter Decay),而这段时间就成为此方法的统计的半衰周期( Counter Half Life Time)。对于第二种是由循环体出发的,但是编译器依然会以整个方法(而不是单独的循环体)作为编译对象,因为发生在方法执行过程中,称为栈上替换(On Stack Replacement,简称为 OSR 编译,即方法栈帧还在栈上,方法就被替换了)。原创 2024-03-01 07:15:00 · 804 阅读 · 2 评论 -
JVM性能优化
对象逃逸的本质是对象指针的逃逸。在计算机语言编译器优化原理中,逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分析和外形分析相关联。当变量(或者对象)在方法中分配后,其指针有可能被返回或者被全局引用,这样就会被其他方法或者线程所引用,这种现象称作指针(或者引用)的逃逸(Escape)。通俗点讲,如果一个对象的指针被多个方法或者线程引用时,那么我们就称这个对象的指针(或对象)的逃逸(Escape)。什么是逃逸分析?原创 2024-03-01 07:00:00 · 1300 阅读 · 0 评论 -
JVM之G1垃圾收集器
收集集合(CSet)代表每次GC暂停时回收的一系列目标分区。在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中。因此无论是年轻代收集,还是混合收集,工作的机制都是一致的。年轻代收集CSet只容纳年轻代分区,而混合收集会通过启发式算法,在老年代候选回收分区中,筛选出回收收益最高的分区添加到CSet中。CSet根据两种不同的回收类型分为两种不同CSet。原创 2024-02-29 07:15:00 · 983 阅读 · 0 评论 -
JVM之CMS垃圾收集器详解
官网CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。采用的是"标记-清除算法",整个过程分为4步由于整个过程中,并发标记和并发清除,收集器线程可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行的。原创 2024-02-29 07:00:00 · 1128 阅读 · 0 评论 -
JVM之垃圾收集器
使用G1收集器时,Java堆的内存布局与就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器,看上去和ParNew一样,但是Parallel Scanvenge更关注系统的。原创 2024-02-28 07:15:00 · 838 阅读 · 2 评论 -
JVM工具介绍
记录了“堆内存使用情况”、“线程”、“类”、“CPU使用情况”共四个资源的实时情况;并且在时间范围可以选择从1分钟到1年的显示情况。原创 2024-02-28 07:00:00 · 858 阅读 · 0 评论 -
Java之SpringMVC源码详解
经典面试题:Struts2和SpringMVC的区别。原创 2024-02-27 07:15:00 · 2494 阅读 · 0 评论 -
JAVA并发编程之原子性、可见性与有序性
CPU处理器在处理速度上,远胜于内存,主内存执行一次内存的读写操作,所需要的时间足够处理器去处理上百条指令。为了弥补处理器与主内存处理能力之间的差距,CPU引入了高级缓存。CPU去主内存拉取数据后,会将数据存储到CPU的高级缓存中,下次如果还涉及到操作这个数据,直接从CPU高速缓存中获取即可,避免了长时间的和主内存操作,对CPU带来的性能损耗。随着硬件能力不断的提升,现在的CPU都是多核的,而每个CPU内核都有自己的高速缓存。原创 2024-02-21 07:00:00 · 1025 阅读 · 5 评论 -
JAVA并发编程-线程池核心原理
工作线程执行的run方法,是栈桢压栈执行,所以run方法里涉及到的内容都是GCRoot,run方法里涉及到了Worker对象的引用 -------> Worker ---------> ThreadPoolExecutor。无论线程构建之初,被认定为核心还是非核心,到后面都是工作线程,而且线程池再多维护一个工作线程的属性,很麻烦,而且对效率有影响。线程池构建线程,也是基于Thread t = new Thread()去构建,虽然在构建前,有一些判断上的不同,但是构建出来的都是线程,不分核心还是非核心!原创 2024-02-20 07:00:00 · 1939 阅读 · 2 评论 -
JAVA并发编程之synchronized与Lock锁详解
synchronized和ReentrantLock都是Java中提供的互斥锁。从功能上来说,你使用无论哪个,功能向都是一样的。today主要分析这两种锁他的实现逻辑。原创 2024-02-19 07:00:00 · 757 阅读 · 0 评论 -
JAVA并发编程之ConcurrentHashMap详解
如果你项目涉及到了多个线程都会操作key-value结构时,别用HashMap,一定要上ConcurrentHashMap。如果此时读线程在红黑树中遍历找数据,结果写线程改变了红黑树的指针,导致无法找到对应的数据。其他所有来协助扩容的线程,发现sizeCtl<-1,直接对sizeCtl做 + 1操作,代表我来扩容了。为了区分谁是第一个来扩容的线程,谁是来协助扩容的线程,需要掌握一个属性,这个属性就是sizeCtl。第一个来扩容的线程会优先修改sizeCtl的值,将其修改为一个<-1的值。原创 2024-02-18 15:29:57 · 810 阅读 · 0 评论 -
JAVA之Java线程核心详解
进程:进程的本质是一个正在执行的程序,程序运行时系统会创建一个进程,并且。同时,在 CPU 对进程做时间片的切换时,保证进程切换过程中仍然要从进程切换之前运行的位置出开始执行。所以进程通常还会包括程序计数器、堆栈指针。线程:有时被称为(Lightweight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派 CPU 的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。原创 2024-02-18 07:00:00 · 889 阅读 · 0 评论 -
JAVA之HashMap详解
HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。jdk1.8 之前 HashMap 由数组 + 链表组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存在的(“拉链法”解决冲突)。原创 2024-02-17 09:39:35 · 1204 阅读 · 0 评论 -
JAVA之数据与结构详解
数据结构是计算机存储组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。接下来分别介绍下常见的数据结构类型。原创 2024-02-16 13:12:03 · 1534 阅读 · 0 评论 -
JAVA设计模式之中介者模式详解
提到中介模式,有一个比较经典的例子就是航空管制。为了让飞机在飞行的时候互不干扰,每架飞机都需要知道其他飞机每时每刻的位置,这就需要时刻跟其他飞机通信。飞机通信形成的通信网络就会无比复杂。这个时候,我们通过引 入“塔台”这样一个中介,让每架飞机只跟塔台来通信,发送自己的位置给塔台,由塔台来 负责每架飞机的航线调度。这样就大大简化了通信网络。原创 2024-02-14 07:30:00 · 1681 阅读 · 0 评论 -
JAVA设计模式之解释器模式详解
解释器模式使用频率不算高,通常用来描述如何构建一个简单“语言”的语法解释器。它只在一些非常特定的领域被用到,比如编译器、规则引擎、正则表达式、SQL 解析等。不过,了解它的实现原理同样很重要,能帮助你思考如何通过更简洁的规则来表示复杂的逻辑。解释器模式(Interpreter pattern)的原始定义是:用于定义语言的语法规则表示,并提供解释器来处理句子中的语法。我们通过一个例子给大家解释一下解释器模式假设我们设计一个软件用来进行加减计算。我们第一想法就是使用工具类,提供对应的加法和减法的工具方法。原创 2024-02-14 07:00:00 · 1549 阅读 · 0 评论 -
JAVA设计模式之备忘录模式详解
备忘录模式提供了一种对象状态的撤销实现机制,当系统中某一个对象需要恢复到某一历史状态时可以使用备忘录模式进行设计.很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。原创 2024-02-13 07:00:00 · 1686 阅读 · 0 评论 -
JAVA设计模式之访问模式详解
访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式.访问者模式(Visitor Pattern) 的原始定义是:允许在运行时将一个或多个操作应用于一组对象,将操作与对象结构分离。这个定义会比较抽象,但是我们依然能看出两个关键点:一个是: 运行时使用一组对象的一个或多个操作,比如,对不同类型的文件(.pdf、.xml、.properties)进行扫描;原创 2024-02-12 07:30:00 · 1274 阅读 · 0 评论 -
JAVA设计模式之迭代器模式详解
迭代器模式是我们学习一个设计时很少用到的、但编码实现时却经常使用到的行为型设计模式。在绝大多数编程语言中,迭代器已经成为一个基础的类库,直接用来遍历集合对象。在平时开发中,我们更多的是直接使用它,很少会从零去实现一个迭代器。迭代器模式(Iterator pattern)又叫游标(Cursor)模式,它的原始定义是:迭代器提供一种对容器对象中的各个元素进行访问的方法,而又不需要暴露该对象的内部细节。原创 2024-02-12 07:00:00 · 1096 阅读 · 0 评论 -
JAVA设计模式之状态模式详解
自然界很多事物都有多种状态,而且不同状态下会具有不同的行为,这些状态在特定条件下还会发生相互转换,比如水在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同状态下也将具有不同的行为.状态模式(state pattern)的定义: 允许一个对象在其内部状态改变时改变它的行为. 对象看起来似乎修改了它的类.状态模式。原创 2024-02-11 07:30:00 · 1503 阅读 · 1 评论 -
JAVA设计模式之职责链模式详解
职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止.在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请 求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再 传递给 C 处理器,以此类推,形成一个链条。原创 2024-02-11 07:00:00 · 1631 阅读 · 0 评论 -
JAVA设计模式之策略模式详解
策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。其实我们在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等。原创 2024-02-10 07:30:00 · 2561 阅读 · 0 评论 -
JAVA设计模式之模版方法模式详解
模板方法模式(template method pattern)原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法中的算法可以理解为广义上的业务逻辑,并不是特指某一个实际的算法.定义中所说的算法的框架就是模板, 包含算法框架的方法就是模板方法.原创 2024-02-10 07:00:00 · 1892 阅读 · 0 评论 -
JAVA设计模式之观察者模式详解
观察者模式的应用场景非常广泛,小到代码层面的解耦,大到架构层面的系统解耦,再或者 一些产品的设计思路,都有这种模式的影子.现在我们常说的基于事件驱动的架构,其实也是观察者模式的一种最佳实践。当我们观察某一个对象时,对象传递出的每一个行为都被看成是一个事件,观察者通过处理每一个事件来完成自身的操作处理。生活中也有许多观察者模式的应用,比如 汽车与红绿灯的关系,‘红灯停,绿灯行’,在这个过程中交通信号灯是汽车的观察目标,而汽车是观察者.。原创 2024-02-09 07:30:00 · 939 阅读 · 0 评论 -
JAVA设计模式之享元模式详解
享元模式 (flyweight pattern) 的原始定义是:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象。从这个定义中你可以发现,享元模式要解决的核心问题就是节约内存空间,使用的办法是找出相似对象之间的共有特征,然后复用这些特征。所谓“享元”,顾名思义就是被共享的单元。比如: 一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,我们可以使用享元模式解决这一类问题.原创 2024-02-09 07:00:00 · 1413 阅读 · 0 评论 -
JAVA设计模式之组合模式详解
组合模式(Composite Pattern) 的定义是:将对象组合成树形结构以表示整个部分的层次结构.组合模式可以让用户统一对待单个对象和对象的组合.比如: windows操作系统中的目录结构,其实就是树形目录结构,通过tree命令实现树形结构展示.在上图中包含了文件夹和文件两类不同元素,其中在文件夹中可以包含文件,还可以继续包含子文件夹.子文件夹中可以放入文件,也可以放入子文件夹. 文件夹形成了一种容器结构(树形结构),递归结构.原创 2024-02-08 07:30:00 · 1535 阅读 · 0 评论 -
JAVA设计模式之外观模式详解
外观模式( Facade Pattern),也叫门面模式, 外观模式的原始定义是:为子系统中的一组接口提供统一的接口。它定义了一个更高级别的接口,使子系统更易于使用。外观模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。门面模式有点类似之前讲到的迪米特法则(最少知识原则)和接口隔离原则:两个有交互的系统,只暴露有限的必要的接口。原创 2024-02-08 07:00:00 · 574 阅读 · 0 评论