Java
文章平均质量分 80
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。该专栏主要关注 Java 在云原生时代下的各种新进化及其相关技术。
一杯甜酒
金融科技领域技术 & 云基础设施 & 云原生微服务 & 云原生时代标准交付 & PAAS 技术研发 & Kubernetes & 项目与技术管理
展开
-
Java 基础学习总结(207)—— 具有革命性、未来性、开创新纪元的 JDK 21, 它来了
至少,人家提供的“跑起来”的版本,从 2018 年跑到了 2023 年,5 年时间。一般不向外部发布,通常会有很多 Bug,除非你也是测试人员,否则不建议使用,alpha 就是 α,是希腊字母的第一位,表示最初级的版本,beta 就是 β,alpha 版就是比 beta 还早的测试版,一般都是内部测试的版本。β 是希腊字母的第二个,顾名思义,这一版本通常是在 Alpha 版本后,该版本相对于 Alpha 版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。原创 2023-09-21 13:23:33 · 345 阅读 · 0 评论 -
Java 基础学习总结(206)—— 比较两个 List 的差异
将两个 List 转换为 Stream 类型;调用 Stream 的 filter 方法,将不同的对象过滤出来;将过滤出的不同的对象转换为 List 类型。上述代码中,将两个 List 类型的对象 list1 和 list2 转换为 Stream 类型,并调用 filter 方法筛选出不同的对象。最后通过 collect 方法将不同的对象转换为 List 类型,并输出结果。原创 2023-08-13 18:35:31 · 1394 阅读 · 0 评论 -
Java 基础学习总结(205)—— 后端接口设计实用技巧汇总
参数校验入参出参校验是每个程序员必备的基本素养。你设计的接口,必须先校验参数。比如入参是否允许为空,入参长度是否符合你的预期长度。这个要养成习惯哈,日常开发中,很多低级bug都是不校验参数导致的。比如你的数据库表字段设置为 varchar(16) ,对方传了一个32位的字符串过来,如果你不校验参数, 插入数据库直接异常了。出参也是,比如你定义的接口报文,参数是不为空的,但是你的接口返回参数,没有做校验,因为程序某些原因,直返回别人一个 null 值。兼容性。原创 2023-03-19 10:49:58 · 698 阅读 · 0 评论 -
Java 基础学习总结(204)—— 重温 SPI 动态扩展机制
SPI 的全称是,翻译过来就是服务提供者的接口,它所实现的其实是一种服务的发现机制。这么说起来可能还是有点不好理解,我举个例子来类比一下。在 spring 项目中,写 service 层代码前,会约定俗成的会添加一个接口层。然后通过 spring 中的依赖注入,可以借助@Autowired等方式注入这个接口的实现类的实例对象,之后对于 service 的调用一般也基于接口操作。原创 2023-03-07 19:21:31 · 639 阅读 · 0 评论 -
Java 基础学习总结(203)—— 生成唯一 ID 打印日志记录最佳实践
几乎所有的 Java 项目中的默认日志框架都会选择 slf4j,在打印日志时,每行数据都有一个请求 ID,这样会方便追踪日志。也可以使用一些链路追踪框架来实现这种目的。slf4j 里有一个 MDC 类,是 ThreadLocal 的实现,保存在这里的变量都会绑定到某一个请求线程中,在该请求的线程里的日志代码都可以使用设置的变量。我这里选择配置的是 AOP 切面来实现在 MDC 中设入 REQUEST_ID 来为每一个请求添加 ID。logback-spring.xml 文件。原创 2022-11-30 10:16:21 · 977 阅读 · 0 评论 -
Java 基础学习总结(202)—— BASE64、MD5、DES、AES、HMAC、恺撒加密、SHA、RSA、PBE 加解密汇总
因此 MD5 经常用于校验字符串或者文件,因为如果文件的 MD5 不一样,说明文件内容也是不一样的,如果发现下载的文件和给定的 MD5 值不一样,就要慎重使用。然后把编码后的密码存入数据库,下次登录的时候把密码 MD5 编码,然后和数据库中的作对比,这样就提升了用户账户的安全性。高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。且若输入的消息不同,它们对应到不同字符串的机率很高。原创 2022-11-29 11:10:16 · 387 阅读 · 0 评论 -
Java 基础学习总结(201)—— 有效提高单元测试的 5 个编写技巧实践
在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类、抽象类、或者派生类中的方法。” —— 摘录来自维基百科。单元测试(Unit Testing)顾名思义就是测试一个单元,这里的单元通常指一个函数或类,区别于集成测试中的模块和系统。集成测试的测试过程通常存在跨系统模块的调用,是一种端到端的测试;原创 2022-11-29 10:23:37 · 435 阅读 · 0 评论 -
Java 基础学习总结(200)—— GraalVM 为什么能被称为下一代虚拟机
GRAALVM 允许本地代码(例如,C/C++)和 JavaScript 的有效组合。可以直接访问本地数据结构,编译器可以跨任何边界内联。在这样一种场景中,当应用程序的其他部分写入时,在C中管理和分配高效数据结构时,这将是有益的 Node.js。原创 2022-11-09 14:58:08 · 1184 阅读 · 0 评论 -
Java基础学习总结(199)—— Nacos、Apollo、Config 配置中心如何选型?
目前市面上用的比较多的配置中心有:(按开源时间排序)这里列一个表格总结一下三个产品的功能特点。总的来说,Apollo 和Nacos 相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,不过使用起来也要麻烦一些。Nacos使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。此外,Nacos除了提供配置中心的功能,还提供了动态服务发现、服务共享与管理的功能,降低了服务化改造过程中的难度。原创 2022-10-22 11:12:24 · 713 阅读 · 0 评论 -
Java基础学习总结(198)—— CompletableFuture 任务编排知识总结
我们知道 Future 的有局限性,它没法直接对多个任务进行链式、组合等处理,需要借助并发工具类才能完成,实现逻辑比较复杂。而 CompletableFuture 是对 Future 的扩展和增强。CompletableFuture 实现了 Future 接口,并在此基础上进行了丰富的扩展,完美弥补了 Future 的局限性,同时 CompletableFuture 实现了对任务编排的能力。借助这项能力,可以轻松地组织不同任务的运行顺序、规则以及方式。从某种程度上说,这项能力是它的核心能力。原创 2022-10-19 14:12:58 · 554 阅读 · 0 评论 -
Java基础学习总结(197)—— CompletableFuture 异常处理总结
【代码】Java基础学习总结(197)—— CompletableFuture 异常处理总结。原创 2022-09-29 16:16:24 · 1609 阅读 · 0 评论 -
Java基础学习总结(196)—— Java、Spring、Dubbo 三种 SPI 机制详解
JDK SPIDUBBO SPISpring SPI文件方式每个扩展点单独一个文件每个扩展点单独一个文件所有的扩展点在一个文件获取某个固定的实现不支持,只能按顺序获取所有实现有“别名”的概念,可以通过名称获取扩展点的某个固定实现,配合Dubbo SPI的注解很方便不支持,只能按顺序获取所有实现。...原创 2022-08-29 14:54:53 · 306 阅读 · 0 评论 -
Java基础学习总结(195)—— 关于 Java 8 中的日期处理总结
在 Java 8 之前我们处理时间相关逻辑的时候用到最多的是 Date 类,而 Java 8 发布后 Date 类的大部分方法被弃。Date 类的缺陷也非常明显,因为如果不对其进行格式化可读性十分很差,而 Simpledateformat 类中的 format 和 parse 方法都是线程不安全的。...原创 2022-08-11 11:42:51 · 361 阅读 · 0 评论 -
Java基础学习总结(194)—— Java 多线程 + List 分段完美解决导入等批量更新场景问题
开启线程池,针对集合的大小进行调参,对小集合进行批量更新操作,对流程进行控制,控制线程执行顺序。获取需要进行批量更新的大集合A,对大集合进行拆分操作,分成N个小集合A-1~A-N。原创 2022-07-14 19:13:15 · 501 阅读 · 0 评论 -
Java基础学习总结(193)—— JUC 常用并发工具类总结
什么是 JUCJUC 就是 java.util.concurrent 包,这个包俗称 JUC,里面都是解决并发问题的一些东西。该包的位置位于 java 下面的 rt.jar 包下面。4大常用并发工具类:CountDownLatch、CyclicBarrier、Semaphore、ExChanger。CountDownLatch:CountDownLatch, 俗称闭锁,作用是类似加强版的 Join, 是让一组线程等待其他的线程完成工作以后才执行,就比如在启动框架服务的时候,我们主线程需要在环境线原创 2022-04-15 03:30:00 · 701 阅读 · 0 评论 -
Java基础学习总结(192)—— 谷歌 Guava 的常用工具集总结
前言Guava 是一组来自谷歌的核心 Java 库,包括新的集合类型(如 multimap 和 multiset)、不可变集合、图形库,以及用于并发、I/O、哈希、缓存、原语、字符串等的实用工具!它在谷歌内部的大多数 Java 项目中被广泛使用,也被许多其他公司广泛使用。github:https://github.com/google/guava。github 文档:https://github.com/google/guava/wiki/Home。中文教程:http://ifeve.com/googl原创 2022-04-15 03:00:00 · 546 阅读 · 0 评论 -
Java基础学习总结(191)—— Oracle GraalVM 详细介绍
GraalVM 简介与特性前面了解了那么多的 JVM 相关技术,我们可以发现一个脉络就是 Java 相关的体系越来越复杂,越来越强大。放眼看去,最近十年来,各种各类的技术和平台层出不穷,每类技术都有自己的适用场景和使用人群。并且伴随着微服务和云原生等理念的出现和发展,越来越多的技术被整合到一起。那么作为目前最流行的平台技术,Java/JVM 也自然不会在这个大潮中置身事外。本节我们介绍一个语言平台的集大成者 GraalVM:从功能的广度上,它的目标是打通各类不同的语言平台,这样开发者可以博取众长,原创 2022-02-22 05:00:00 · 760 阅读 · 0 评论 -
Java 学习总结(190)—— Java 测试覆盖率工具 Jacoco 简介
前言测试过程中根据需求文档和设计文档编写测试用例、执行测试;为了更加全面的覆盖,我们可能还需要理解被测程序的逻辑,需要考虑到每个函数的输入与输出,逻辑分支代码的执行情况,这个时候我们的测试执行情况就以代码覆盖率来衡量。覆盖率是衡量测试效果的一个辅助指标。分析未覆盖部分的代码,从而反推在前期测试设计是否充分,没有覆盖到的代码是否是测试设计的盲点,为什么没有考虑到?需求/设计不够清晰、测试设计的理解有误、工程方法应用后的造成的策略性放弃等等,之后进行补充测试用例设计。检测出程序中的废代码,可以逆向反推在代码原创 2022-02-18 06:00:00 · 905 阅读 · 0 评论 -
Java 学习总结(189)—— Java 8 功能接口使用总结
前言功能接口是指只有一个抽象方法的接口,功能接口只能有一个抽象方法,但是可以有多个默认方法和静态方法。一个功能接口可以被注解 FunctionalInterface 注释,一旦被 FunctionalInterface 注解注释,当这个功能接口有多个抽象方法时编译器就会报错。基于只有一个抽象方法的接口使用匿名类时,会使代码看上去很臃肿,针对这个问题 lambda 表达式应运而生。要想使用 lambda 表达式首先必须要有一个对应的功能接口。jdk 里面有一些内置的功能接口,这些内置的功能接口在实际开发过原创 2022-02-10 13:03:17 · 685 阅读 · 0 评论 -
Java 学习总结(188)—— Java 8 方法引用使用总结
前言功能接口是只有一个抽象方法的接口,创建一个lambda表达式时,需要有一个对应的功能接口。lambda表达式可以认为是一个功能接口的抽象方法的具体实现。有一种极端情况,就是一个lambda表达式里面的逻辑非常简单,它只是简单地调用了一个方法。针对这种情况我们就可以省去lambda表达式,改为方法引用,即通过这个方法的名称对这个方法直接进行引用。方法引用是由lambda表达式演进而来的,是针对lambda表达式的一种特殊情况的简化。静态方法引用语法: Class::staticMetho原创 2022-02-09 12:11:43 · 295 阅读 · 0 评论 -
Java 学习总结(187)—— 轻量级开源日志框架 tinylog 简介
前言前段时间,日志框架各种漏洞爆雷,包括:Log4j 1.x, Log4j 2.x, Logback 等都有爆雷,几乎是团灭。Log4j, Logback 都是主流的日志框架,功能也非常强大,不仅仅是日志记录,所以,功能多,自然也会带来更多的漏洞。其实我们使用日志框架,最多的还是记录系统日志,其他的乱七八糟的功能用的非常少,所以,如果我们仅仅是想寻求一款简单的日志记录框架,可以尝试一下轻量级的开源日志框架tinylog。tinylog基本介绍官方网站:https://tinylog.org.原创 2022-01-21 11:15:54 · 1363 阅读 · 0 评论 -
Java基础学习总结(186)—— GraalVM 是 Java 在云原生时代保持强大竞争力的大杀器吗
前言自 1996 年诞生以来,Java 语言长期在最受欢迎的编程语言排行榜中占据领先地位。除了语言本身的优秀特性之外,Java 语言持续演进、不断发展也是它能够保持长盛不衰的重要原因。Java 语言的功能和性能都在不断地发展和提高,但是冷启动开销较大的问题长期存在,难以从根本上解决。Java 语言也因此在 Serverless 场景下无法与 Node.js、Go 等快速启动的语言竞争,落于下风。在这种背景下,作为能够从根本上解决冷启动问题的Java 静态编译技术有了用武之地,开始在业界崭露头角,...原创 2022-01-18 10:28:05 · 308 阅读 · 0 评论 -
Java基础学习总结(185)—— Java 在云原生时代的进化
前言在企业软件领域,Java 依然是绝对王者,但它让开发者既爱又恨。一方面因为其丰富的生态和完善的工具支持,可以极大提升了应用开发效率;但在运行时效率方面,Java 也背负着”内存吞噬者“,“CPU撕裂者“的恶名,持续受到 NodeJS、Python、Golang、Rust 等新老语言的挑战。在技术社区,我们经常看到有人在唱衰 Java 技术,认为其不再符合云原生计算发展的趋势。我们先抛开这些观点,首先思考一下云原生对应用运行时的不同需求。体积更小:对于微服务分布式架构而言,更小的体积意味着更少的原创 2022-01-12 14:30:05 · 346 阅读 · 0 评论 -
Java基础学习总结(184)—— 从 Java 9 到 Java 17 的新特性解读
Java 9Java 9 最大的变化就是引入了一个JShell和模块化,日常并没有用太多,所以今天不花时间在这些功能上面。新的创建集合的方法用过谷歌Guava类库的知道,Guava提供了创建集合的静态工厂方法,而且能够推断泛型,举个例子:List<Person>list=Lists.newArrayList();Map<KeyType,Person>map=Maps.newLinkedHashMap();而原生态需要各种new来定义。Java ...原创 2021-12-13 18:17:54 · 467 阅读 · 0 评论 -
Java基础学习总结(183)—— Flyway 在项目中迁移数据实践
一、问题产生项目在多环境迭代开发过程中,数据库的表结构不断变更,在部署时,往往会出现数据库表结构未及时变更导致出现问题,耗费在表结构上的时间相当多,上线过程持续痛苦,代码有 GIT/SVN 来控制,数据库中的表版本也可以做到版本控制,本文讲解通过 flyway 的方式来管理数据库版本变动。一个项目单个环境迭代开发的过程中,对于数据库表的修改 DDL,可以通过版本控制工具一起进行控制。只需要在项目上线之前,人工执行新增的 DDL 即可,DDL 的版本是与当前项目迭代版本一致,细致点不至于出现问题。对于偏企原创 2021-11-30 11:15:10 · 1025 阅读 · 0 评论 -
Java基础学习总结(182)——Java 日志记录实践总结
一、日志简介1.1 日志是什么(WHAT)日志:记录程序的运行轨迹,方便查找关键信息,也方便快速定位解决问题。通常,Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug 调试功能来跟踪解决Bug,但项目发布到了测试、生产环境怎么办?你有可能会说可以使用远程调试,但实际并不能允许让你这么做。所以,日志的作用就是在测试、生产环境没有 Debug 调试工具时开发和测试人员定位问题的手段。日志打得好,就能根据日志的轨迹快速定位并解决线上问题,反之,日志输出不好,不原创 2021-11-12 11:10:51 · 279 阅读 · 0 评论 -
Java基础学习总结(181)——Nacos、Apollo、Config配置中心如何选型?
1、为什么需要配置中心1、配置实时生效传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置。2、配置管理流程配置的权限管控、灰度发布、版本管理、格式检验和安全配置等一系列的配置管理相关的特性也是配置中心不可获取的一部分。2、开源配置原创 2021-09-29 09:13:51 · 467 阅读 · 0 评论 -
Java基础学习总结(180)——如何保证API接口安全
一、摘要在实际的业务开发过程中,我们常常会碰到需要与第三方互联网公司进行技术对接,例如支付宝支付对接、微信支付对接、高德地图查询对接等等服务,如果你是一个创业型互联网,大部分可能都是对接别的公司api接口。当你的公司体量上来了时候,这个时候可能有一些公司开始找你进行技术对接了,转变成由你来提供api接口,那这个时候,我们应该如何设计并保证API接口安全呢?二、方案介绍最常用的方案,主要有两种:token方案 接口签名2.1、token方案其中 token 方案,是一种在web端原创 2021-05-28 10:26:59 · 1053 阅读 · 0 评论 -
Java基础学习总结(179)——Java 日志框架冲突解决方案大汇总
前言你是否遇到过配置了日志,但打印不出来的情况?你是否遇到过配置了logback,启动时却提示log4j错误的情况?像下面这样:log4j:WARN No appenders could be found for logger (org.example.App).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#no原创 2021-04-08 10:47:02 · 323 阅读 · 0 评论 -
Java基础学习总结(178)——时候替换你的logback/log4j1了,使用性能更强大配置更简单的log4j2
Log4j2简介Apache Log4j 2是 Log4j(1) 的升级版,比它的祖先 Log4j 1. x 有了很大的改进,和logback对比有很大的改进。除了内部设计的调整外,主要有以下几点的大升级:更简化的配置 更强大的参数格式化 最夸张的异步性能Log4j 2中,分为**API(log4j-api)和实现(log4j-core)**两个模块。API 和slf4j 是一个类型,属于日志抽象/门面,而实现部分,才是Log4j 2的核心。org.apache.logging.log4j原创 2021-04-08 10:32:29 · 567 阅读 · 0 评论 -
Java基础学习总结(177)——关于Oracle对JDK长期支持(LTS)路线图
长期支持版(LTS)LTS,Long-term support,长期支持,软件的产品生命周期政策,延长了软件维护的周期,增加了软件开发过程及软件版本周期的可靠度。长期支持(LTS)版本通常与应用程序或操作系统有关,会在较长的时间内获得安全、维护和(有时有)功能的更新。Oracle的长期支持的JDK版本:JDK8、 JDK11、JDK17,学习、应用、商用,都可以选择Oracle Java SE支持路线图:地址:https://www.oracle.com/java/technologie原创 2021-03-24 09:23:41 · 2871 阅读 · 0 评论 -
Java基础学习总结(176)——JDK 16 正式发布,一次性发布 17 个新特性
JDK 16 正式发布JDK 16 不是一个长期支持的版本,只支持 6 个月到 2021 年 9 月,上一个长期支持版本还是 JDK 11,下一个长期支持版本是 JDK 17,还有半年也要发布了。所以千万不要把 JDK 16(非长期支持版本)用于生产,大家了解一下就好。JDK 16 新特性一览ID JEP Feature 1 394 Pattern Matching for instanceof 2 395 Records 3 392原创 2021-03-18 09:58:21 · 975 阅读 · 0 评论 -
Java基础学习总结(175)——分布式ID的9种生成方式总结
背景业务量小于500W的时候单独一个mysql即可提供服务,再大点的时候就进行读写分离也可以应付过来。但当主从同步也扛不住的是就需要分表分库了,但分库分表后需要有一个唯一ID来标识一条数据,数据库的自增ID显然不能满足需求;特别一点的如订单、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。那么这个全局唯一ID就叫分布式ID。分布式ID需满足那些条件:全局唯一:基本要求就是必须保证ID是全局性唯一的。 高性能:高可用低延时,ID生成响应要快。 高可用:无限接近于10原创 2021-03-16 10:27:08 · 1193 阅读 · 0 评论 -
Java基础学习总结(174)——Java 开发者应该会的流程图绘制技巧
一、流程图简单介绍流程图 (Flow Chart )是流经一个系统的信息流、观点流或部件流的图形代表。在企业中,流程图主要用来说明某一过程。这种过程既可以是生产线上的工艺流程,也可以是完成一项任务的管理过程。流程图是揭示和掌握封闭系统运动状况的有效方式。作为诊断工具,它能够辅助决策制定,让管理者清楚地知道,问题可能出在什么地方,从而确定出可供选择的行动方案。(摘自MBA智库·百科)相比于时序图而言,流程图不需要过多考虑时间的维度,它能更加一目了然地描述各种分支情况的走向。针对不同的用户群,流程图有很多种原创 2021-03-08 10:17:07 · 12126 阅读 · 4 评论 -
Java基础学习总结(173)——Java 8到Java 15新功能总结
函数式编程(Java 8)在Java 8中,功能编程和lambda被添加为语言功能。函数式编程的两个核心范例是不变的值和将函数提升为一等公民的方法。数据经过一系列修改步骤,其中每个步骤都需要一些输入并将其映射到新的输出。函数式编程可与Java中的Streams和null安全monad(可选)一起使用,如下所示…List<String> stringList = Arrays.asList("Hello", "World", "How", "Are", "You", "Today");原创 2021-03-05 10:10:50 · 482 阅读 · 3 评论 -
Java基础学习总结(172)——手写Java 重试机制
package com.zhy.common.retry;import java.util.Arrays;import org.apache.commons.lang3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * @ClassName RetryWrap * @Description (异常重试机制) * @author ZHY * @date 2021-2-22 11:09:48.原创 2021-02-22 11:59:08 · 455 阅读 · 0 评论 -
Java基础学习总结(171)——CountDownLatch 使用总结
一、CountDownLatch 是什么?CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。二、CountDown原创 2021-01-21 10:48:20 · 366 阅读 · 0 评论 -
Java基础学习总结(170)——Java8并发工具类CompletableFuture学习总结
1、What's a CompletableFuture?首先了解什么是CompletableFuture,它是用于Java中的异步编程。异步编程是一种编写非阻塞代码的方法,它通过在主应用程序线程独立的线程上运行任务,并通知主线程其进度、完成或失败。 这样,你的主线程就不会阻塞、等待任务的完成,它可以并行地执行其他任务。 拥有这种并行性可以极大地提高程序的性能。2、Future vs CompletableFutureCompletableFuture是Java Future API的扩展,该.原创 2021-01-14 11:36:10 · 437 阅读 · 0 评论 -
Java基础学习总结(169)——ThreadLocal 使用总结
一.ThreadLocal 常用场景1、场景一:每个线程需要一个独享对象(通常是工具类,典型需要使用的类有SimpleDateFormat和Random);每个Thread内有自己的实例副本,不共享。比喻:教材只有一本,一起做笔记有线程安全问题。复印后没有问题,使用ThradLocal相当于复印了教材。2、场景二:每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。二、场景实践1、场景一的实例/** * 两个线程打印日期 *原创 2021-01-08 11:12:44 · 385 阅读 · 0 评论 -
Java基础学习总结(168)——为什么推荐在RPC的接口中入参和出参都不要使用枚举
前言:为什么推荐在RPC的接口中入参和出参都不要使用枚举。最近,我们的线上环境出现了一个问题,线上代码在执行过程中抛出了一个IllegalArgumentException,分析堆栈后,发现最根本的的异常是以下内容:java.lang.IllegalArgumentException:Noenumconstantcom.a.b.f.m.a.c.AType.P_M大概就是以上的内容,看起来还是很简单的,提示的错误信息就是在AType这个枚举类中没有找到P_M这个枚举项。于是经过排查...原创 2020-12-31 09:43:55 · 806 阅读 · 0 评论