
java
文章平均质量分 76
奋斗永不止步
这个作者很懒,什么都没留下…
展开
-
java设计模式-总结
一、实例的创建单例模式模式定义:保证一个类只有一个实例,并且提供一个全局访问点场景:重量级的对象,不需要多个实例,如线程池,数据库连接池。1.懒汉模式:延迟加载, 只有在真正使用的时候,才开始实例化。1)线程安全问题2)double check 加锁优化3)编译器(JIT),CPU 有可能对指令进行重排序,导致使用到尚未初始化的实例,可以通过添加volatile 关键字进行修饰,对于volatile 修饰的字段,可以防止指令重排。2.饿汉模式:类加载的 初原创 2022-05-15 11:54:05 · 282 阅读 · 0 评论 -
Java锁详解
乐观锁/悲观锁 独享锁/共享锁 互斥锁/读写锁 可重入锁 公平锁/非公平锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 以上是一些锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。一、乐观锁/悲观锁 乐观锁与悲观锁并不是特指某两种类型的锁,是人们定义出来的概念或思想,主要是指看待并发同步的角度。悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。乐观锁 ...原创 2022-04-26 20:47:21 · 852 阅读 · 0 评论 -
jmap、jstat、jinfo、jstack命令详解
jmapjmap -histo [pid] > ./log.txt 此命令可以用来查看内存信息,实例个数以及占用内存大小 num:序号 instances:实例数量 bytes:占用空间大小 class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][] jmap -heap [pid]jmap -dump:format=b,fil原创 2022-01-14 14:56:44 · 2496 阅读 · 0 评论 -
Java BigDecimal详解
一、BigDecimal概述Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDeci原创 2022-01-14 14:40:28 · 379 阅读 · 0 评论 -
springboot集成kafka
springboot集成kafka一、maven pom配置二、application.yml配置三、生产者代码:四、消费者代码:一、maven pom配置引入spring boot kafka依赖<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId></dependency>原创 2021-07-22 17:46:37 · 154 阅读 · 0 评论 -
spring循环依赖详解
Bean的生命周期被Spring管理的Bean的生成步骤如下:Spring扫描class得到BeanDefinition;根据得到的BeanDefinition去生成bean;首先根据class推断构造方法;根据推断出来的构造方法,反射,得到一个对象(暂时叫做原始对象);填充原始对象中的属性(依赖注入);如果原始对象中的某个方法被AOP了,那么则需要根据原始对象生成一个代理对象;把最终生成的代理对象放入单例池(源码中叫做singletonObjects)中,下次getBean时就直接从单原创 2022-01-12 13:50:05 · 783 阅读 · 0 评论 -
Spring事务详解
Spring事务执行步骤:判断当前执行的方法是否存在@Transactional注解;如果存在,则利用事务管理器(TransactionMananger)新建一个数据库连接;修改数据库连接的autocommit为false;执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql;执行完了之后如果没有出现异常,则提交,否则回滚。Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,要判断到底是不是直接通过【代理对象】调用的原创 2022-01-11 14:32:01 · 1570 阅读 · 0 评论 -
spring bean创建流程+demo
Spring启动流程:解析启动类,得到扫描路径;遍历扫描路径下的java类文件; 如果类文件存在@Component、@Config等注解,则存入BeanDefinitionMap<String,Class>中,key为beanName。遍历BeanDefinitionMap,通过反射创建Bean;Bean创建流程:spring的一大优点就是扩展性很强,比如,在spring bean 的生命周期中,给我们预留了很多参与bean 的生命周期的方法。大致梳理一下,有以下几种:原创 2022-01-11 14:29:31 · 583 阅读 · 0 评论 -
SLF4J: Class path contains multiple SLF4J bindings
异常信息:SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Foundbinding in[jar:file:/D:/tools/maven/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: Found binding in[ja原创 2022-01-11 11:35:41 · 374 阅读 · 0 评论 -
java.lang.NoClassDefFoundError: reactor/ipc/netty/http/client/HttpClient
java.lang.NoClassDefFoundError: reactor/ipc/netty/http/client/HttpClient问题:springboot项目启动时报NoClassDefFoundError: reactor/ipc/netty/http/client/HttpClient报错信息:nested exception is org.springframework.beans.BeanInstantiationException: Failed to instant原创 2022-01-04 16:14:10 · 1470 阅读 · 0 评论 -
springboot启动类不能正常启动
springboot启动类不能正常启动1、启动配置加@SpringBootApplication注解@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}2、导入spring-boot-starter-web包 <depen原创 2022-01-04 10:58:37 · 6069 阅读 · 2 评论 -
缓存穿透、缓存击穿、缓存雪崩--详解
一、缓存穿透缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起id为-1的数据或者特别大的不存在的数据。有可能是黑客利用漏洞攻击从而去压垮应用的数据库。常见解决方案对于缓存穿透问题,常见的解决方案有以下三种:1、验证拦截:接口层进行校验,如鉴定用户权限,对ID之类的字段做基础的校验,如id<=0的字段直接拦截;2、缓存空数据:当数据库查询到的数据为空时,也将这条数据进行缓存,但缓存的有效性设置得要较短,以免影响正常数据的缓存;public Student getStuden原创 2022-01-04 10:34:22 · 264 阅读 · 0 评论 -
swagger之API接口版本控制+demo案例
springboot整合swagger配置在之前的文章已经写过了,此篇是基于已整合swagger后的,关于版本控制的配置和demo案例。文章地址:swagger2 注解详解+使用案例版本控制思路:此demo是基于swagger的group进行版本控制,对接口URL无侵入,版本对接口地址无影响。相关操作和注意项:无新增依赖jar包;新增自定义版本注解ApiVersion ;新增版本号定义(常量或枚举值都行);手动实例化Docket对象,并注入到spring容器;相关解释都在代码注释里;原创 2021-12-01 18:23:40 · 1355 阅读 · 0 评论 -
swagger2 注解详解+使用案例
API注解说明:注解使用位置注意事项@Api用于controller类上基于类的整体描述@ApiOperation用于controller类内部的方法上基于方法功能的描述@ApiImplicitParams用于controller类内部的方法上非Model对象的参数描述,包含多个@ApiImplicitParam@ApiImplicitParam用于@ApiImplicitParams内单个参数的描述@ApiModel用于参数为Model对象原创 2021-11-24 13:43:40 · 906 阅读 · 0 评论 -
Swagger:Unable to infer base url. This is common when using dynamic servlet registration or when...
问题描述打开:http://localhost:8080/swagger-ui.html 报如下信息:Unable to infer base url. This is common when using dynamic servletregistration or when the API is behind an API Gateway. The base url isthe root of where all the swagger resources are served. For e.g原创 2021-11-23 13:54:42 · 1832 阅读 · 1 评论 -
计算机浮点数存储(java)
一、前言我们通常认为浮点数和小数是等价的,并没有严格区分它们的概念,这也并没有影响到我们的学习,原因就是浮点数和小数是绑定在一起的,只有小数才使用浮点格式来存储。其实,整数和小数可以都使用定点格式来存储,也可以都使用浮点格式来存储,但实际情况却是,使用定点格式存储整数,使用浮点格式存储小数,这是在 “数值范围” 和 “数值精度” 两项重要指标之间追求平衡的结果。二、什么是浮点数?浮点型简单讲就是实数的意思。浮点数在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某原创 2021-09-07 11:16:29 · 665 阅读 · 0 评论 -
JVM G1垃圾回收器
G1收集器简介(-XX:+UseG1GC)G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征.G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数"XX:G1HeapRegionSize"手动指定Region大小,但是推荐原创 2021-09-05 21:40:37 · 698 阅读 · 0 评论 -
JVM垃圾回收机制详解
JVM垃圾回收机制详解一、引用计数法二、可达性分析算法1、常见引用类型三、垃圾收集算法1、标记-复制算法2、标记-清除算法3、标记-整理算法4、分代收集理论5、三色标记对象内存回收堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。一、引用计数法给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0 的对象就是不可能再被使用的。 这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这原创 2021-08-24 17:20:41 · 465 阅读 · 0 评论 -
JVM内存模型详解
JVM内存模型一、JVM整体结构及内存模型二、JVM内存参数设置三、对象创建的主要流程:四、指针压缩五、对象栈上分配六、对象在Eden区分配七、对象进入老年代一、JVM整体结构及内存模型二、JVM内存参数设置-Xss:每个线程的栈大小-Xms:设置堆的初始可用大小,默认物理内存的1/64-Xmx:设置堆的最大可用大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-XX:SurvivorRatio:默认8表示一个原创 2021-08-16 14:38:13 · 899 阅读 · 0 评论 -
JAVA类加载器和双亲委派机制
JAVA类加载器和双亲委派机制一、类加载过程二、类加载器三、双亲委派机制1、沙箱安全机制:2、全盘负责委托机制3、Tomcat打破双亲委派机制一、类加载过程加载 >> 验证 >> 准备 >> 解析 >> 初始化 >> 使用 >> 卸载加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为原创 2021-08-09 11:00:28 · 171 阅读 · 0 评论 -
ConcurrentHashMap在JDK8中的优化
ConcurrentHashMap在JDK8中的优化JDK8之前JDK8为什么不继续使用ReentrantLockJDK8之前JDK8之前,ConcurrentHashMap是通过分段锁(Segment加锁)来减少多线程中锁竞争,首先在初始化ConcurrentHashMap的时候,会初始化一个Segment数组,容量为16,而每个Segment呢,都继承了ReentrantLock类,也就是说每个Segment类本身就是一个锁,之后Segment内部又有一个table数组,每个table数组里的数据原创 2021-08-06 15:38:35 · 2828 阅读 · 0 评论 -
Java线程池的关闭
Java线程池的关闭一、线程中断interrupt方法两个作用二、线程池的关闭shutdownNow方法的源码:advanceRunState(STOP)interruptWorkers()tasks = drainQueue()runWorker方法源码getTask方法源码总结:shutdown方法的源码:interruptIdleWorkers源码总结:三、优雅的关闭线程池总结:一、线程中断在介绍线程池关闭之前,先介绍下Thread的interrupt。 在程序中,我们是不能随便中断一个线原创 2021-07-15 15:07:06 · 1899 阅读 · 0 评论 -
Java内部锁 synchronized详解(偏向锁和轻量级锁)
Java synchronized内部锁详解(偏向锁和轻量级锁)偏向锁JDK 6 以前 synchronized具体实现逻辑:由于 synchronized 重量级锁有以下二个问题,:因此JDK 6 之后做了改进,引入了偏向锁和轻量级锁:synchronized锁状态无锁偏向锁轻量级锁重量级锁原创 2021-07-23 09:47:53 · 767 阅读 · 0 评论 -
kafka基本原理详解
kafka详解一、简介二、Kafka的使用场景三、Kafka基本概念四、server.properties核心配置详解五、生产策略(Producers)六、消费策略(Consumers)七、消费顺序一、简介Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式原创 2021-07-22 17:25:22 · 364 阅读 · 0 评论 -
Java终止线程的三种方式
Java终止线程的三种方式:1、线程正常退出,也就是当 run() 方法完成后线程中止。2、使用 stop()> 方法强行终止线程,但是不推荐使用这个方法,该方法已被弃用。3、使用 interrupt> 方法中断线程,在当前线程中打一个停止的标记,并不是真的停止线程。一、线程正常退出在 run() 方法执行完毕后,该线程就终止了。但是在某些特殊的情况下,run() 方法会被一直执行;在服务端程序中可能会使用 while(true) { … }这样的循环结构来不断的接收来自客户转载 2021-07-12 15:59:55 · 4325 阅读 · 0 评论 -
java8新的时间日期库
java8中的java.time包中的类是不可变且线程安全的。新的时间及日期API位于java.time中原创 2018-08-25 12:29:13 · 1002 阅读 · 0 评论 -
java-String类深入剖析和 intern()方法解析
java-String类深入剖析和 intern()方法解析转载 2016-03-02 16:32:37 · 372 阅读 · 0 评论 -
Java并发编程与技术内幕:ThreadFactory、ThreadLocal
1.1.源码解读ThreadFactory这个故名思义,就是一个线程工厂。用来创建线程。这里为什么要使用线程工厂呢?其实就是为了统一在创建线程时设置一些参数,如是否守护线程。线程一些特性等,如优先级。通过这个TreadFactory创建出来的线程能保证有相同的特性。下面来看看它的源码吧它首先是一个接口类,而且方法只有一个。就是创建一个线程。转载 2016-06-21 12:33:55 · 1195 阅读 · 0 评论