Java
文章平均质量分 73
Please Sit Down
Fake it,until make it!
展开
-
有三个线程T1,T2,T3,如何保证顺序执行?
在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。实际上先启动三个线程中哪一个都行, 因为在每个线程的run方法中用join方法限定了三个线程的执行顺序。这些方法都可以用来确保线程按照指定顺序执行。选择其中一种方式取决于你的具体需求和场景。原创 2024-09-24 22:19:12 · 247 阅读 · 0 评论 -
判断线程池任务执行完成的方式
Thread线程是否执行完成,我们可以调用join方法然后等待线程执行完成;那在使用线程池的时候,我们如何知道线程已经执行完成了?本文就带给大家。原创 2024-09-24 21:58:42 · 782 阅读 · 0 评论 -
线程到底设置数量多少合适的探讨
一个极端的线程(不停执行“计算”型操作时),就可以把单个核心的利用率跑满,多核心CPU最多只能同时执行等于核心数的“极端”线程数如果每个线程都这么“极端”,且同时执行的线程数超过核心数,会导致不必要的切换,造成负载过高,只会让执行更慢I/O 等暂停类操作时,CPU处于空闲状态,操作系统调度CPU执行其他线程,可以提高CPU利用率,同时执行更多的线程I/O 事件的频率频率越高,或者等待/暂停时间越长,CPU的空闲时间也就更长,利用率越低,操作系统可以调度CPU执行更多的线程。原创 2024-01-12 10:23:41 · 1052 阅读 · 0 评论 -
使用上下文获取用户IP信息
原理:使用拦截器拦截所有请求,并把请求中的。,这样在业务逻辑中,我们可以很轻松的拿到。原创 2024-01-02 15:53:18 · 1094 阅读 · 0 评论 -
一个注解实现分布式锁
我们平常使用redisson的分布式锁是怎么做的?是不是基本都用的这个模板,既然是模板,那为何不把他抽出来呢?原创 2023-12-28 16:14:45 · 794 阅读 · 0 评论 -
JDK8 新特性
创建一个新的线程,指定线程要执行的任务代码分析:Lambda表达式是一个匿名函数,可以理解为一段可以传递的代码Lambda表达式的优点:简化了匿名内部类的使用,语法更加简单。匿名内部类语法冗余,体验了Lambda表达式后,发现Lambda表达式是简化匿名内部类的一种方式。Lambda省去了面向对象的条条框框,Lambda的标准格式由3个部分组成:格式说明:练习无参无返回值的Lambda定义一个接口然后创建主方法使用输出:3.2 Lambda练习2完成一个有参且有返回值得Lambda表达式案例创原创 2023-12-28 15:24:22 · 1084 阅读 · 0 评论 -
AOT编程
Ahead-of-Time(提前,全部被编译成:Just in Time(即时): 程序边,边运行;原创 2023-12-26 16:04:43 · 1147 阅读 · 0 评论 -
SpringBoot3 整合Kafka
官网:https://kafka.apache.org/documentation/原创 2023-12-26 15:44:46 · 1435 阅读 · 0 评论 -
SpringBoot3 整合Swagger
Swagger 可以快速生成文档,方便前后开发人员进行协调沟通。遵循规范。文档:https://springdoc.org/v2/原创 2023-12-26 15:34:07 · 2024 阅读 · 2 评论 -
SpringBoot3 整合Redis
RedisTemplate、StringRedisTemplate: 操作redis的工具类。要从redis的连接工厂获取链接才能操作redis。属于 JPA 操作,也不用管。属于响应式编程,不用管。原创 2023-12-26 15:27:29 · 1315 阅读 · 0 评论 -
SpringBoot3 核心原理
抽取聊天机器人场景,它可以打招呼。效果:任何项目导入此starter都具有打招呼功能,并且问候语中的人名需要可以在配置文件中修改创建自定义starter项目,引入基础依赖编写模块功能,引入模块所有需要的依赖。编写自动配置类,帮其他项目导入这个模块需要的所有组件编写配置文件指定启动需要加载的自动配置其他项目引入即可使用。原创 2023-12-26 15:14:47 · 1027 阅读 · 0 评论 -
SpringBoot3 基础特性
1.3. FluentBuilder API2. Profiles环境隔离能力;快速切换开发、测试、生产环境步骤:2.1.1 指定环境Spring Profiles 提供一种隔离配置的方式,使其仅在特定环境生效;任何@Component, @Configuration 或 @ConfigurationProperties 可以使用 @Profile 标记,来指定何时被加载。【容器中的组件都可以被 标记】@prifile是可以用在组件@Bean上的,表示此组件的生效环境,如果没有具体指定环境就原创 2023-12-26 14:51:54 · 1019 阅读 · 0 评论 -
SpringBoot3 数据访问
SpringBoot 整合 、、 进行数据访问场景开发2. 配置数据源安装MyBatisX 插件,帮我们生成Mapper接口的xml文件即可需要再SpringBoot的启动类上添加@MapperScan(basePackages=“xxx”)来告诉mybatis,扫描哪个包下的所有接口4. CRUD编写编写Bean编写Mapper使用插件,快速生成MapperXML测试CRUD5. 自动配置原理SSM整合总结:导入 配置数据源信息配置mybatis的与编写bean,mapper,生成原创 2023-12-26 12:43:07 · 480 阅读 · 0 评论 -
SpringBoot3 Web开发
自定义静态资源路径、自定义缓存规则导入依赖原创 2023-12-26 11:44:12 · 608 阅读 · 0 评论 -
SpringBoot3 核心技能
Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。spring5及以后 commons-logging被spring直接自己写了。支持 jul,log4j2,logback。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件。logback是默认使用的。虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的默认配置就能工作的很好。SpringBoot怎么把日志默认配置好的1、每个starter。原创 2023-12-26 10:04:00 · 1609 阅读 · 1 评论 -
SpringBoot3 应用分析
导入相关的场景,就拥有相关的功能。即场景启动器。默认支持的所有场景:Developing with Spring Boot官方提供的场景:命名为:spring-boot-starter-*第三方提供场景:命名为:*-spring-boot-starter原创 2023-12-26 09:32:43 · 980 阅读 · 0 评论 -
JVM 性能调优
配置完线程数之后,我们的请求的平均响应时间和GC时间都有一个明显的减少了,仅从效果上来看,我们这次的优化是有一定效果的。大家在工作中对于线上项目进行优化的时候,可以考虑到这方面的优化。原创 2023-12-08 10:34:02 · 618 阅读 · 0 评论 -
JVM 运行时参数
面试题JVM的参数,你知道的说一下 (百度)说说你知道的几种主要的JVM参数(京东)JVM调优调的哪些参数?在哪里写这些参数?(亚信)内存调优参数都有什么?(顺丰)JVM调优调的哪些参数?问这样有什么好处?在哪里写这些参数(浪潮)原创 2023-12-07 15:50:42 · 540 阅读 · 0 评论 -
JVM GUI可视化监控及诊断工具
MAT(Memory Analyzer Tool)工具是一款功能强大的Java堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用。是一款免费的性能分析工具,使用起来非常方便。大家可以在https://www.eclipse.org/mat/downloads.php下载并使用MAT。只要确保机器上装有JDK并配置好相关的环境变量,MAT可正常启动。原创 2023-12-07 11:49:36 · 887 阅读 · 0 评论 -
JVM 命令行监控及诊断工具
性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。体会2:无监控、不调优!简单命令行工具。原创 2023-12-07 10:10:08 · 335 阅读 · 0 评论 -
JVM 分析GC日志
输出gc日志信息,默认输出到标准输出。原创 2023-12-06 15:50:41 · 289 阅读 · 0 评论 -
JVM 垃圾回收
什么是垃圾( Garbage) 呢?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。外文:An object is considered garbage when it can no longer be reached from any pointer in the running program.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。原创 2023-12-06 15:19:09 · 1027 阅读 · 0 评论 -
JVM 执行引擎篇
动态编译(compile during run-time),英文称Dynamic compilation;Just In Time也是这个意思。HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。Java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。原创 2023-12-06 10:39:35 · 1389 阅读 · 0 评论 -
JVM 对象内存布局篇
1、new对象最常见的方式变形1:X的静态方法变形2:XxxBuilder/XxxFactory的静态方法2、Class的newlnstance0:反射的方式,只能调用空参的构造器,权限必须是public3、Constructor的newinstance(X):反射的方式,可以调用空参、带参的构造器,权限没有要求,实用性更广4、使用clone():不调用任何构造器,当前类需要实现Cloneable接口,实现clone(),默认浅拷贝int age;原创 2023-12-06 09:18:21 · 244 阅读 · 0 评论 -
JVM 运行时内存篇
Java虚拟机栈是什么?Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。是线程私有的。生命周期生命周期和线程一致。特点栈是一种快速有效的分配存储方式,访问速度仅次于程序计数器。如何理解栈管运行,堆管存储?面试题堆和栈的区别、谁的性能更高(艾绒软件)为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?(阿里)原创 2023-12-04 11:38:58 · 587 阅读 · 0 评论 -
JVM 类的加载
类模板对象所谓类模板对象,其实就是Java类在JVM内存中的一个快照,JVM将从字节码文件中解析出的常量池、类字段、类方法等信息存储到类模板中,这样JVM在运行期便能通过类模板而获取Java类中的任意信息,能够对Java类的成员变量进行遍历,也能进行Java方法的调用。反射的机制即基于这一基础。如果JVM没有将Java类的声明信息存储起来,则JVM在运行期也无法反射。类模型的位置加载的类在JVM中创建相应的类结构,类结构会存储在方法区(JDK1.8之前:永久代;JDK1.8及之后:元空间)。原创 2023-12-01 14:31:48 · 213 阅读 · 0 评论 -
JVM 字节码
Java 虚拟机不和包括 Java 在内的任何语言绑定,它只与“Class 文件”这种特定的二进制文件格式所关联。无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。可以说,统一而强大的Class文件结构,就是Java虚拟机的基石、桥梁。想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。Java SE规范。原创 2023-11-30 17:32:10 · 364 阅读 · 0 评论 -
如何设计一个高并发系统?
那高并发绝对搞挂你的系统,你要是用 redis 来承载写那肯 定不行,人家是缓存,数据随时就被 LRU 了,数据格式还无比简单,没有事务支持。浅显一点,很简单,就是因为刚开始系统都是连接数据库的,但是要知道数据库支撑到 每秒并发两三千的时候,基本就快完了。所以才有说,很多公司,刚开始干的时候,技术比较 low,结果业务发展太快,有的时候系统扛不住压力就挂了。分库分表,可能到了最后数据库层面还是免不了抗高并发的要求,好吧,那么就将一个数据库 拆分为多个库,多个库来扛更高的并发;大部分的高并发场景,都是。转载 2023-06-29 16:07:18 · 149 阅读 · 0 评论 -
分库分表之后,id 主键如何处理?
其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后, 每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实 际生产环境中必须考虑的问题。转载 2023-06-29 15:25:05 · 116 阅读 · 0 评论 -
BIO、NIO、AIO详解
BIO(Blocking I/O)就是传统的Java IO编程,其相关的类和接口在java.io包下。BIO是同步阻塞的,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。服务器端启动一个,注册端口,调用accpet方法监听客户端的Socket连接客户端启动Socket对服务器进行通信,默认情况下服务器端需要对每个客户建立一个线程与之通讯。转载 2023-06-28 17:07:16 · 647 阅读 · 0 评论 -
Java 中 Object 的划分
从业务模型的角度看 , 见 UML 元件领域模型中的领域对象。就是说在一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录的 persisent object 完全是一个符合 Java Bean 规范的纯 Java 对象,没有增加别的属性和方法。 这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB 的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象。原创 2022-09-18 19:29:04 · 160 阅读 · 0 评论 -
java 实现 pbkdf2_sha256 加密验证算法
pbkdf2_sha256 加密验证算法原创 2022-06-22 14:59:30 · 1777 阅读 · 0 评论 -
CAS单点登录
CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS 是 耶鲁大学(Yale University)发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。原创 2022-06-01 14:13:57 · 6979 阅读 · 5 评论 -
Math类中的ceil、floor、round
1、ceil:向上取整;Math.ceil(11.3) = 12;Math.ceil(-11.3) = 11;2、floor:向下取整;Math.floor(11.3) = 11;Math.floor(-11.3) = -12;3、round:四舍五入;加0.5然后向下取整。Math.round(11.3) = 11;Math.round(11.8) = 12;Math.round(-11.3) = -11;Math.round(-11.8) = -12;...原创 2022-04-15 22:16:32 · 654 阅读 · 0 评论 -
动态代理模式
代理模式代理模式是一种常用的Java设计模式,代理模式是指处理一个业务逻辑时,通过代理的方式完成。代理模式中包含被代理方(委托方)和代理方,委托方委托代理帮助他完成某些工作。在所有的代理模式中,委托方和代理方都有一个共性,即双方都具备完成需求的能力。Java程序中如何描述这个关系?将类所具备的能力封装成接口,Java委托类和代理类需要实现同一个接口。代理类和委托类是通过依赖注入进行关联,在设计程序时需要将委托类定义为代理类的成员变量1、所有的操作全部在代...原创 2022-04-10 11:27:31 · 906 阅读 · 0 评论 -
4种单例模式实现
多线程下的单例模式1、懒汉模式// 饿汉模式(线程安全)public class Singleton { // 私有化构造器,不允许创建对象 private Singleton(){} // 加载的时候就产生的实例对象ClassLoader private static Singleton instance = new Singleton(); // 返回实例 public Singleton getInstance(){ retu原创 2022-04-10 11:01:48 · 343 阅读 · 0 评论 -
synchronized底层原理、volatile关键字分析
synchronized锁synchronized锁用法// synchronized锁底层原理public class SynchronizedTest03 { //修饰静态方法(同步方法) //代码块0(锁定的是当前类) public synchronized static void access0(){ try { TimeUnit.*MINUTES*.sleep(1); System.*out*.println(Thread.currentThrea原创 2022-02-10 16:35:00 · 331 阅读 · 0 评论 -
Spring Cloud Alibaba操作手册2.2.1版
创建父工程Spring Cloud Alibaba 的环境在父工程中创建,微服务的各个组件作为子工程,继承父工程的环境。1、创建 Spring Boot 工程,选择常用的 Lombok,Spring Cloud Alibaba 还没有完全集成到 Spring Boot Initialzr 中,我们需要手动添加。Spring Boot —》Spring Cloud —》Spring Cloud AlibabaSpring Boot 版本修改为 2.3.0,因为高版本有 bug。pom.xml 中添加原创 2022-02-10 16:17:53 · 1489 阅读 · 0 评论 -
计算两个数的平均值几种方法
方法一:直接求平均值(两个数相加再除以二)int average(int x,int y){ return (x + y) / 2;}这种算法存在着一定的缺陷,当x和y足够大时x和y的和就会存在数据溢出,从而得不到我们想要的结果。(不推荐采用)方法二:x + y与x的差值除以2的和,可以避免数据溢出int average(int x,int y){ return x + (y - x) / 2;}方法三:改进方法二版本(位移)int average(int.原创 2021-10-29 21:25:21 · 8873 阅读 · 0 评论 -
不使用第三方变量交换x,y的值
int x = 10; int y = 5;第一种方法:(不推荐,有可能会超出int的取值范围,有弊端)x = x + y; //10 + 5 = 15; --> x=15y = x - y; //15 - 5 = 10; --> y=10x = x - y; //15 - 10 = 5; --> x=5结果:x=5,y=10第二种方法:(使用^[位异或]来进行)x = x ^ y; //x = 10 ^ 5y = x ^ y; //y...原创 2021-08-23 18:26:09 · 294 阅读 · 0 评论