杰克说
94年的博客创作者,软件工程师,CSDN博主。喜欢打抱不平,行侠仗义。有人性格内向,有人性格外向,这是我的博客。全网搜索杰克说,喜欢记得点赞关注评论哦。
展开
-
领域驱动设计:事件溯源架构简介
事件溯源的定义事件溯源是数据持久化的一种方式——对数据只做新增,不做修改和删除。在一些数据变更非常重要的业务场景,如财务、金融领域,可能会使用这种数据持久化方式。和传统的面向状态的的数据持久化方式相比,事件溯源将每个引发数据变更的动作称之为事件,并把这种事件按照事情发生顺序存储起来。与事件驱动的区别事件溯源和事件驱动,都是以事件为本,事件是它们的核心组成部分,在使用事件驱动的时候也是将引发数据变更的动作称为事件,也会经常把事件按照顺序存储下来,所以有时候经常会把这两种模式混淆。原创 2025-02-28 17:32:22 · 386 阅读 · 0 评论 -
发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
蓝绿发布提供了一种零宕机的部署方式。不停老版本,部署新版本进行测试,确认OK,将流量切到新版本,然后老版本同时也升级到新版本。始终有两个版本同时在线,有问题可以快速切换。比如日常运行时,需要10台服务器支撑业务,那么使用蓝绿部署,你就需要购置二十台服务器。原创 2025-02-27 18:37:51 · 163 阅读 · 0 评论 -
Java中常用的设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。原创 2024-08-14 11:19:53 · 890 阅读 · 0 评论 -
使用 IDEA 远程 Debug 调试
好像感觉远程调试的用处也不是那么大,不能作为长期使用的调试工具。只能作为临时调试的手段。难点有几个:1.难保证本地代码和远程一致,而且你也很难判断是否一致。2.通过远程调试发现了bug,但是又不能立即修复后继续调试,只能修复后部署后继续远程调试。原创 2024-12-17 21:05:15 · 159 阅读 · 0 评论 -
Java的 BIO,NIO,AIO 总结
熟练掌握 BIO,NIO,AIO 的基本概念以及一些常见问题是你准备面试的过程中不可或缺的一部分,另外这些知识点也是你学习 Netty 的基础。一、同步异步与阻塞非阻塞Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码。只需要使用Java的API就可以了。 在讲 BIO,NIO,AIO 之前先来回顾一下这样几个概念:同步与异步,阻塞与非阻塞。.原创 2021-05-24 19:35:28 · 477 阅读 · 0 评论 -
JAVA8 新特性 stream接口 distinct,sorted,peek,limit, skip
jdk8新特性原创 2022-08-04 16:06:49 · 491 阅读 · 0 评论 -
Spring Bean的生命周期与源码分析
Spring Bean的生命周期是Spring面试热点问题。这个问题即考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文希望能够从源码角度入手,帮助面试者彻底搞定Spring Bean的生命周期。一、四个阶段Spring Bean的生命周期只有这四个阶段。把这四个阶段和每个阶段对应的扩展点糅合在一起虽然没有问题,但是这样非常凌乱,难以记忆。要彻底搞清楚Sp...原创 2020-02-20 15:36:13 · 276 阅读 · 0 评论 -
synchronized的四种用法
一 修饰方法Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来的范围,而修饰方法范围是整个函数。例如:方法一:public synchronized void method(){ // todo}方法二:public v......原创 2018-10-25 22:16:44 · 573 阅读 · 0 评论 -
@scheduled注解作用
用来开启定时任务fixedRate 任务两次执行时间间隔是任务的开始点,而 fixedDelay 的间隔是前次任务的结束与下次任务的开始。@Scheduled(fixedRate = 5000) 5秒执行一次cron表达式详解一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为:秒(0~59)分钟(0~59)3 小时(0~23)4 天(0~31)5 月(0~11)6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)年份(1970-20原创 2022-08-04 15:32:34 · 447 阅读 · 0 评论 -
高并发之API接口限流
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流缓存缓存的目的是提升系统访问速度和增大系统处理容量 降级降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开 限流限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理问题描述 某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃。如何应对这种情...原创 2021-12-23 10:57:05 · 1272 阅读 · 0 评论 -
Java正则表达式matcher.group()用法
总结:其实group(),start(),end()所带的参数i就是正则表达式中的子表达式索引(第几个子表达式),由于刚开始对Java正则表达式中的组的概念不清晰,导致理解困难。当将“组”的概念与“子表达式”对应起来之后,理解matcher的group,start,end就完全没有障碍了。java中正则匹配 group是针对()来说的,因为你匹配到的结果是一组,group(0)就是指的整个串,group(1) 指的是第一个括号里的东西,group(2)指的第二个括号里的东西。原创 2022-12-08 17:29:29 · 5695 阅读 · 1 评论 -
spring的IOC控制反转和DI依赖注入
目录一、 简单说明二、详细说明1.1、IoC是什么1.2、IoC能做什么1.3、IoC和DI一、 简单说明IOC是一种叫做“控制反转”的设计思想。1、较浅的层次——从名字上解析“控制”就是指对 对象的创建、维护、销毁等生命周期的控制,这个过程一般是由我们的程序去主动控制的,如使用new关键字去创建一个对象(创建),在使用过程中保持引用(维护),在失去全部引用后由GC去回收对象(销毁)。“反转”就是指对 对象的创建、维护、销毁等生命周期的控制由程序控制改为由IOC容器控制,原创 2021-05-12 21:11:38 · 252 阅读 · 0 评论 -
C#与Java 的区别
相同点:都是面向对象编程的语言,都能够实现面向对象的(封装,继承,多态)思想不同点:1.c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用import而c#中用using。2.c#和Java都是从main函数入口的,但是c#中的main函数的首字母必须大写3.数据类型:Java跟c#基本都差不多,但是Jav......原创 2018-10-19 17:52:36 · 412 阅读 · 0 评论 -
Kafka面试题
总的来说,如果你的系统需求是大数据处理和实时流分析,Kafka 是更好的选择;如果你关注的是消息可靠性、多种消息协议支持或需要良好的管理界面,RabbitMQ 可能更适合;而 ActiveMQ 则在需要 JMS 完整支持和更多的高级特性时成为了首选。选择合适的消息系统需要考虑不同的技术需求和业务目标,如消息吞吐量、数据持久性、系统扩展性和开发资源。在做决策时,要仔细权衡每种队列管理系统的优势和局限,并充分理解其在不同场景下表现的差异。原创 2024-09-13 14:24:07 · 676 阅读 · 0 评论 -
XXL-JOB面试问题
XXL-Job 是一款分布式任务调度平台,用于解决分布式系统中的定时任务和异步任务调度问题。它提供了任务的注册、调度、执行和监控等功能,能够帮助开发者简化任务调度的复杂性,提高任务执行的准确性和稳定性。原创 2024-08-04 21:43:51 · 498 阅读 · 0 评论 -
图文详解线程池ThreadPoolExecutor的实现原理
1. 为什么要使用线程池在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:降低资源消耗。通过复用已存在的线程和降低线程关闭的次数来尽可能降低系统性能损耗; 提升系统响应速度。通过复用线程,省去创建线程的过程,因此整体上提升了系统的响应速度; 提高线程的可管理性。线程是稀缺资源,...原创 2020-02-04 16:48:54 · 892 阅读 · 2 评论 -
Java面试题Tomcat的优化经验
Tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:一、掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存二、服务器资源 服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。 (1) 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。 (2) ...原创 2018-10-24 17:21:02 · 736 阅读 · 0 评论 -
图文详解面试必备之HashMap、Hashtable、ConcurrentHashMap的原理与区别
下面直接来干货,先说这三个Map的区别:HashTable底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为11,扩容:newsize = olesize*2+1 计算index的方法:index = (hash & 0x7FF...原创 2019-06-03 00:54:13 · 276 阅读 · 1 评论 -
从底层原理深度剖析volatile关键字
本篇文章从底层原理层面深度剖析volatile关键字是如何实现内存可见性的,同时引入了Java内存模型、指令重排序以及内存屏障等知识点作为原理分析的知识支撑。一、简述Java内存模型Java内存模型分为主内存和线程工作内存两大类。主内存:多个线程共享的内存。如下图所示,方法区和堆属于主内存区域。线程工作内存:每个线程独享的内存。如下图所示,虚拟机栈、本地方法栈、程序计数器属于线程独享的工作内存。Java内存模型规定:所有变量都需要存储在主内存中,线程工作内存保存了变量在主内存中...原创 2020-07-21 20:52:25 · 367 阅读 · 1 评论 -
图文详解spring的4种事务特性,5种隔离级别,7种传播行为
什么是事务:事务是指逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。事务特性(4种):原子性 (atomicity):强调事务的不可分割,要么一起成功,要么一起失败。 一致性 (consistency):事务的执行时,前后数据的完整性保持一致。 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰。 持久性(dur...原创 2020-04-09 14:53:50 · 585 阅读 · 0 评论 -
JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
我是一名java开发人员,hibernate以及mybatis都有学习,在java面试中也经常被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加得心应手。第一方面:开发速度的对比就开发速度而言,Hibernate真正掌握要比Mybatis要难一些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉...原创 2018-12-06 19:02:27 · 190 阅读 · 0 评论 -
图文详解ThreadLocal原理
目录一、示例:二、ThreadLocal实现原理 set()方法:get()方法:三、ThreadLocal使用场景:一、示例:ThreadLocal称为线程本地变量,其为变量在每个线程中都创建了一个副本,每个线程都访问和修改本线程中变量的副本。 应用示例:ThreadLocal<SimpleDateFormat> t1=new ThreadLocal<>();可以看出,为每个线程分配一个变量副本的工作并不是由Th...原创 2020-07-21 20:23:16 · 441 阅读 · 0 评论 -
全面分析Hashmap在JDK1.7和JDK1.8有哪些区别
一、HashmapJDK1.7和JDK1.8有哪些区别?(1)头插与尾插: JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。(2)扩容后数据存储位置...原创 2020-03-12 18:59:32 · 1136 阅读 · 1 评论 -
java中的多线程你只要看这一篇就够了
目录引言扎好马步:线程的状态内功心法:每个对象都有的方法(机制)太祖长拳:基本线程类RunnableCallable九阴真经:高级多线程控制类1.ThreadLocal类2.原子类(AtomicInteger、AtomicBoolean……)3.Lock类 4.容器类5.管理类引言如果对什么是线程、什么是进程仍存有疑惑,请先百度之,因为这两个......原创 2019-06-02 20:28:50 · 252 阅读 · 0 评论 -
JVM面试题及答案-图文详解
类加载器 就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在\lib目录或-Xbootclasspath参数指定的路径中的类库加载到内存中。其他类加载器:由Java语言实现,继承自抽象类ClassLoader。原创 2020-04-09 21:10:50 · 628 阅读 · 0 评论 -
Java面试题大全 (上) --2021版
结合网上的资料以及自身面试经历,花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~一、Java基础知识面试题1、Java概述①. 何为编程编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。②. 什么是Java原创 2021-05-16 15:53:16 · 313 阅读 · 0 评论 -
协程、同步与异步在java中的实现
前言 最近在学习协程,打算输出几篇文章来介绍一下协程。而协程与异步有很大的关联,所以想先介绍一下异步。异步是一种程序的运行方式,各种编程语言语言或多或少都对它有所支持。异步对于Java后端程序员来说并不是一种特别熟悉的概念,而安卓或者前端的同学可能会对异步这个概念会更熟悉一些。程序同步和异步同步是最简单也是最符合我们人类思维方式的编程方式,所谓同步,就是程序会按照代码一行行执行,执行完一句再执行下一句。同步代码看起来是这样:stepA();stepB();stepC(....原创 2022-04-13 17:43:44 · 1413 阅读 · 2 评论 -
图文详解Java多线程常用面试题(含答案,精心总结整理)
目录现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?在java中wait和sleep方法的不同?用Java实现阻塞队列。BlockingQueue介绍:用Java写...原创 2018-11-08 16:14:00 · 680 阅读 · 0 评论 -
学习笔记:JVM内存结构、垃圾回收器种类、垃圾回收算法、内存分配与回收策略、Java 内存模型与线程、虚拟机类加载机制与类加载器
1. Java 内存区域与内存溢出异常1.1 运行时数据区域根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。1.1.1 程序计数器内存空间小,线程私有。字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。如果线程正在执...原创 2020-04-10 16:20:06 · 319 阅读 · 0 评论 -
Java面试题大全 (下) --2021版
前言: 接着上篇博客《Java面试题大全 (上) --2021版》写,三、Java异常面试题1. Error 和 Exception 区别是什么?Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行..原创 2021-05-16 16:05:42 · 216 阅读 · 0 评论 -
java.nio.ByteBuffer常用方法详解
一、前言在Java nio中,主要有三大组件:Buffer,Channel和Selector。这三者之间的关系可以按照如下方式进行理解:Buffer提供了一个字节缓冲区,其可以不断的从Channel中读取接收到的数据。Buffer的优点主要在于其提供了一系列的Api,能够让用户更方便的对数据进行读取和写入; Channel简单来说就是一个信道,也就是客户端与服务器的一个连接,而且每个客户端都会对应一个Channel对象; Selector是Java nio能够支持高并发数据处理一个关键,其核心理原创 2021-08-04 18:17:42 · 5461 阅读 · 0 评论 -
图文详解Spring AOP
一、什么是AOP首先先给出一段比较专业的术语(来自百度):在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使...原创 2020-04-17 21:08:12 · 563 阅读 · 0 评论 -
Java的List集合根据实体类的属性去重数据
Java List集合根据实体类的属性去重数据。原创 2022-12-08 17:11:42 · 1969 阅读 · 0 评论 -
Java爬虫详解
我们需要提取图中圈出来的内容及其对应的链接,在提取的过程中,我们会使用两种方式来提取,一种是 Jsoup 的方式,另一种是 httpclient + 正则表达式的方式,这也是 Java 网络爬虫常用的两种方式,你不了解这两种方式没关系,后面会有相应的使用手册。在正式编写提取程序之前,我先交代一下 Java 爬虫系列博文的环境,该系列博文所有的 demo 都是使用 SpringBoot 搭建的,不管你使用哪种环境,只需要正确的导入相应的包即可。原创 2022-11-03 10:56:49 · 5475 阅读 · 1 评论 -
详解蚂蚁开源框架SOFA
前言SOFA解决:分布式下的服务和组件管理以及调用繁琐的问题SOFA结构图1.Sofa是什么SOFA 源自于 Service Oriented Fabric Architecture,即面向服务的架构。随着 SOFA 的开源,目前 SOFA 的新解释:Scalable Open Financial ArchitectureSOFA 是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,.原创 2020-08-02 16:15:08 · 15335 阅读 · 0 评论 -
SpringBoot 中到底如何解决跨域问题?
同源策略是浏览器的一个重要的安全策略,它用于限制一个源的文档或其加载的脚本如何与另外一个源进行交互,它能够隔绝恶意文档,减少被攻击的媒介。如果两个URL的协议、主机名和端口号都是相同的,那么这两个URL就是同源的,否则不同源,不同源的访问就会出现跨域问题,就会出现上面的错误。下表给出了与 URLURL结果原因同源只有路径不同非同源协议不同非同源端口号不同非同源主机名不同也就是说当在这个网站中向、和三个地址发起AXJX请求都会失败并且会报跨域的错误。...原创 2022-08-04 15:27:00 · 844 阅读 · 0 评论 -
图文详解mina框架
Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。Mina 主要有1.x 和...原创 2019-02-23 15:14:20 · 21343 阅读 · 10 评论 -
Java中基本数据类型和包装类型的区别
1、包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址;基本类型不是2、包装类型是引用的传递;基本类型是值的传递3、声明方式不同:基本数据类型不需要new关键字;包装类型需要new在堆内存中进行new来分配内存空间4、存储位置不同:基本数据类型直接将值保存在值栈中;...原创 2019-02-26 16:48:05 · 22065 阅读 · 6 评论 -
什么是事务? 事务的隔离级别和事务运行的模式分别是什么?spring 事务和分布式事务实现方式有哪些?
什么是事务?百度百科中解释:指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。简单的说,事务就是并发控制的单位,是用户定义的一个操作序列。而一个逻辑工作单元要成为事务,就必须满足ACID属性。A:原子性(Atomicity) 事务中的操作要么都不做,要么就全做。C:一致性(Consistency) 事务执行的结果必须是从数据库从一个一致性状态...原创 2019-01-27 23:26:53 · 19303 阅读 · 0 评论 -
Java异步注解@Async详解
再查看一下initializeExecutor抽象方法的具体实现类,其中有一个就是ThreadPoolTaskExecutor类,查看它的initializeExecutor方法,使用的就是ThreadPoolExecutor。在需要异步执行的方法上加入@Async注解,并指定使用的线程池,当然可以不指定,直接写@Async。的名称,也就是不自定义线程池,@Async是有默认线程池的,使用的是Spring默认的线程池SimpleAsyncTaskExecutor。配置文件中的线程池核心线程数为何配置为。原创 2022-11-10 16:47:26 · 22256 阅读 · 0 评论