【Java - Java Base】
文章平均质量分 92
Java 基础——从入门到精通,实例讲解
小小工匠
show me the code ,change the world
展开
-
Java Review - SPI 原理、实现与最佳实践
SPI(Service Provider Interface)是Java的一种机制,用于实现服务的动态发现和加载。SPI允许开发者在不修改应用程序代码的情况下,通过配置文件动态地为接口添加不同的实现。原创 2024-08-26 20:15:00 · 1208 阅读 · 0 评论 -
Java - 深入四大限流算法:原理、实现与应用
限流算法是一种在分布式系统中广泛使用的技术,用于控制对系统资源的访问速率,以保护系统免受恶意攻击或突发流量导致的过载。API 网关限流:在微服务架构中,API 网关通常是系统对外的唯一入口,需要限制单个用户或IP在一定时间内的请求次数,以保护后端服务不受恶意请求或突发流量的冲击。分布式系统中的服务限流:在分布式系统中,各个服务之间可能会有调用关系,通过限流可以控制服务间的调用频率,避免服务间因为调用过于频繁而造成的服务过载。微服务间的接口限流。原创 2024-01-21 11:43:20 · 4234 阅读 · 0 评论 -
动态编译 - Dynamically Compile and Load External Java Classes
读取源代码: 首先,需要获取到外部的Java源代码。这通常是通过读取文件、网络资源或者数据库中的源代码字符串来实现的。编译源代码: 接下来,需要使用Java编译器来编译这些源代码。这可以通过调用javac命令行工具或者使用Java API中的编译器API(如)来实现。生成字节码: 编译过程会生成字节码文件(.class文件)。这些字节码文件包含了编译后的Java类的信息。加载字节码: 最后,需要将这些字节码文件加载到Java虚拟机(JVM)中。这可以通过创建一个子类并重写其loadClass。原创 2024-01-07 05:45:00 · 4033 阅读 · 0 评论 -
Java Review - MapStruct_使用 Intellij 和 Maven Debug 分析MapStruct实现原理
通过定义映射接口和相应的映射方法,MapStruct 在编译时生成这些接口的实现类,从而实现了类型安全的对象映射,避免了手动编写繁琐且容易出错的映射代码。例如,当你使用MapStruct注解来标注两个Java Bean类,并希望通过注解处理器生成它们之间的映射代码时,MapStruct的注解处理器就会被javac调用。MapStruct 使用注解处理器技术,结合了JSR 269的功能,实现了在编译时生成高效的映射代码,从而提供了更快的执行速度和更好的类型安全性。命令来切换到POM文件所在的目录。原创 2024-01-05 06:15:00 · 4165 阅读 · 0 评论 -
Java Review - MapStruct全掌握:9个案例探究高效快捷的Java对象映射
MapStruct是一个代码生成库,旨在简化Java Bean之间的映射。它允许开发者在定义了映射规则后,通过注解处理器在编译时自动生成映射代码。MapStruct遵循“约定优于配置”的原则,大多数情况下,它能够智能地处理常见的映射场景,而无需开发者编写繁琐的映射逻辑。MapStruct允许在映射器中定义自定义方法,实现复杂的映射逻辑。例如,可以定义一个方法,将源对象中的某个字段进行转换后赋值给目标对象Entity@Data// 出厂日期 , String类型@Data。原创 2024-01-05 04:45:00 · 5249 阅读 · 0 评论 -
Java Review - Java命令行参数指南:掌握 -D 和 -- 的使用技巧
在Java应用中,参数传递可以通过命令行选项进行,其中包括使用-D和--作为前缀的选项。原创 2023-11-25 09:45:00 · 4736 阅读 · 0 评论 -
Java Review - 关于代理的二三事儿
代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。在 Java 中,代理模式有两种形式:静态代理动态代理在代理模式中,代理类和目标类之间有一个抽象接口,代理类实现了这个接口,而目标类则实现了具体的业务逻辑。通过代理类调用目标类,可以实现对目标类的访问控制、权限检查、审计等功能。代理模式在 Java 中应用广泛,例如可以使用代理模式来实现对网络请求的缓存、访问控制、限流等功能。静态代理是一种在编译时生成代理类的方式。在静态代理中,代理类和委托类的关系在运行前就确定了。原创 2023-08-14 20:15:00 · 7510 阅读 · 0 评论 -
Java Review - 使用Event Bus实现目录变化的监控
文章目录Pre需求Event Bus案例实战PreJava Review - Java进程内部的消息中间件_Event Bus设计模式需求监控文件的实时变化 , 就这一句话???分析一下其中一个有问题的思路:程序首次启动时获取该文件的最后修改时间并且做文件的首次解析,然后每隔一段指定的时间检查一次文件最后被修改的时间,如果与记录的时间相等则等待下次的采集(Balking Pattern),否则进行新一轮的采集并且更新时间。这。。。。有问题啊 , 比如在采集时间间隔内,文件发生了N次原创 2022-01-07 02:21:38 · 31483 阅读 · 2 评论 -
Java Review - 并发编程_ThreadLocalRandom实现原理&源码分析
文章目录概述Random的局限性ThreadLocalRandom使用及原理ThreadLocalRandom源码分析小结概述ThreadLocalRandom类是JDK 7在JUC包下新增的随机数生成器,它弥补了Random类在多线程下的缺陷。我们这里主要讲解为何要在JUC下新增该类,以及该类的实现原理。Random的局限性ThreadLocalRandom使用及原理ThreadLocalRandom源码分析小结...原创 2021-11-28 23:05:04 · 26104 阅读 · 0 评论 -
Java Review - 并发编程_伪共享
文章目录what's 伪共享what’s 伪共享为了解决计算机系统中主内存与CPU之间运行速度差问题,会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。这个Cache一般是被集成到CPU内部的,所以也叫 CPU Cache .下图所示是两级Cache结构在Cache内部是按行存储的,其中每一行称为一个Cache行。Cache行(如下图所示)是Cache与主内存进行数据交换的单位,Cache行的大小一般为2的幂次数字节。当CPU访问某个变量时,首先会去看CPU Cache内是否原创 2021-11-28 19:57:40 · 26070 阅读 · 0 评论 -
Java Review - 并发编程_Unsafe
文章目录UnsafeUnsafe 提供的几个主要的方法使用Unsafe类UnsafeJDK 的 rt.jar 包中的 Unsafe 类提供了硬件级别的原子性操作,Unsafe 类中的方法都是native 方法,它们使用 JNI 的方式访问本地 C++ 实现库。Unsafe 提供的几个主要的方法下面我们来了解一下 Unsafe 提供的几个主要的方法以及编程时如何使用 Unsafe 类做一些事情。使用Unsafe类...原创 2021-11-27 15:42:11 · 26176 阅读 · 0 评论 -
Java Review - 并发编程_锁的分类
文章目录乐观锁与悲观锁公平锁与非公平锁独占锁与共享锁可重入锁自旋锁乐观锁与悲观锁乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面也引入了类似的思想。悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改,所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制,即在数据库中,在对数据记录操作前给记录加排它锁。如果获取锁失败,则说明数据正在被其他线程修改,当前线程则等待或者抛出异常。如果获取锁成功,则对记录进原创 2021-11-27 10:46:06 · 25032 阅读 · 0 评论 -
Java Review - 并发编程_前置知识二
文章目录What's 多线程并发编程What’s 多线程并发编程首先要澄清并发和并行的概念并发是指同一个时间段内多个任务同时都在执行,并且都没有执行结束并行是说在单位时间内多个任务同时在执行并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行。在单CPU的时代多个任务都是并发执行的,这是因为单个CPU同时只能执行一个任务。在单CPU时代多任务是共享一个CPU的,当一个任务占用CPU运行时,其他任务就会被挂起,当占用CP原创 2021-11-23 23:06:29 · 24672 阅读 · 0 评论 -
Java Review - 使用Timer时需要注意的事情
文章目录概述问题复现概述 先说结论 当一个Timer运行多个TimerTask时,只要其中一个TimerTask在执行中向run方法外抛出了异常,则其他任务也会自动终止。问题复现原创 2021-11-21 20:29:19 · 24874 阅读 · 0 评论 -
Java Review - SimpleDateFormat线程不安全原因的源码分析及解决办法
文章目录概述概述SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,在日常开发中经常会用到,但是由于它是线程不安全的,所以多线程共用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错。这里来揭示它为何是线程不安全的,以及如何避免该问题。...原创 2021-11-21 14:55:37 · 25153 阅读 · 0 评论 -
Java Review - 并发组件ConcurrentHashMap使用时的注意事项及源码分析
文章目录概述案例概述ConcurrentHashMap虽然为并发安全的组件,但是使用不当仍然会导致程序错误。我们这里通过一个简单的案例来复现这些问题,并给出开发时如何避免的策略。案例来个简单的例子,比如有一个注册中心 , 客户端要注册...原创 2021-11-21 10:44:34 · 25089 阅读 · 1 评论 -
Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例&源码分析
文章目录概述Why 内存泄露 ?概述ThreadLocal的基本使用我们就不赘述了,可以参考每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal直接进入主题。 我们今天要聊的是使用ThreadLocal会导致内存泄漏的原因,并给出使用ThreadLocal导致内存泄漏的案例及源码分析。Why 内存泄露 ?...原创 2021-11-21 09:02:02 · 24972 阅读 · 1 评论 -
Java Review - 线程池使用FutureTask的小坑
文章目录概述问题复现概述先说结论 线程池使用FutureTask时如果把拒绝策略设置为 DiscardPolicy和 DiscardOldestPolicy,并且在被拒绝的任务的Future对象上调用了无参get方法,那么调用线程会一直被阻塞。问题复现import java.util.concurrent.*;/** * @author 小工匠 * @version 1.0 * @description: TODO * @date 2021/11/21 0:11 * @ma原创 2021-11-21 01:05:09 · 24871 阅读 · 1 评论 -
Java Review - 线程池资源一直不被释放案例&源码分析
文章目录概述概述在日常开发中为了便于线程的有效复用,经常会用到线程池,然而使用完线程池后如果不调用shutdown关闭线程池,则会导致线程池资源一直不被释放。下面通过简单的例子来说明该问题。...原创 2021-11-20 23:31:18 · 26822 阅读 · 1 评论 -
Java Review - 创建线程和线程池时建议指定与业务相关的名称
文章目录概述不指定线程名称为何难定位问题Thread默认的线程名称概述在日常开发中,当在一个应用中需要创建多个线程或者线程池时最好给每个线程或者线程池根据业务类型设置具体的名称,以便在出现问题时方便进行定位。下面就通过实例来说明不设置为何难以定位问题,以及如何进行设置。不指定线程名称为何难定位问题import java.util.concurrent.TimeUnit;/** * @author 小工匠 * @version 1.0 * @description: TODO *原创 2021-11-20 12:28:52 · 23771 阅读 · 0 评论 -
Java Review - LinkedHashMap & LinkedHashSet 源码解读
文章目录Pre概述数据结构PreJava Review - HashMap & HashSet 源码解读 中我们讲了HashSet和HashMap 。 那同样的套路 , LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,LinkedHashSet仅仅是对LinkedHashMap做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。故我们还是重点分析LinkedHashMap。概述LinkedH原创 2021-11-17 00:00:00 · 23645 阅读 · 0 评论 -
Java Review - HashMap & HashSet 源码解读
文章目录概述构造函数概述HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;跟TreeMap不同,HashMap容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。根据对冲突的处理方式不同,哈希表有两种实现方式,一种开放地址方式(Open addressing),另一种是冲突链表方式(Se原创 2021-11-15 23:06:25 · 23798 阅读 · 0 评论 -
Java Review - PriorityQueue源码解读
文章目录PrePriorityQueue 概述PreJava Review - ArrayList 源码解读Java Review - LinkedList源码解读Java Review - Queue和Stack 源码解读PriorityQueue 概述Java Review - Queue和Stack 源码解读以Java ArrayDeque为例讲解了Stack和Queue,还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权原创 2021-11-14 22:43:26 · 22822 阅读 · 0 评论 -
Java Review - Queue和Stack 源码解读
文章目录Pre概述PreJava Review - ArrayList 源码解读Java Review - LinkedList源码解读概述Java中有Stack类,却没有叫做Queue的类,它是个接口的名字。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了,次选LinkedList。...原创 2021-11-14 19:04:29 · 22981 阅读 · 0 评论 -
Java Review - 集合框架=Collection+Map
文章目录概述容器 = Collection + Map概述容器,就是可以容纳其他Java对象的对象。 Java Collections Framework(JCF) 为Java开发者提供了通用的容器。我们知道 Java容器里只能放对象,对于基本类型(int, long, float, double等),需要将其包装成对象类型后(Integer, Long, Float, Double等)才能放到容器里。很多时候拆箱和装箱能够自动完成。这虽然会导致额外的性能和空间开销,但简化了设计和编程。容原创 2021-11-13 23:48:22 · 22850 阅读 · 1 评论 -
Java - Java集合中的安全失败Fail Safe机制 (CopyOnWriteArrayList)
文章目录Pre概述fail-safe的容器—CopyOnWriteArrayListPreJava - Java集合中的快速失败Fail Fast 机制概述ArrayList使用fail-fast机制自然是因为它增强了数据的安全性。但在某些场景,我们可能想避免fail-fast机制抛出的异常,这时我们就要将ArrayList替换为使用fail-safe机制的CopyOnWriteArrayList.采用安全失败机制的集合容器,在 Iterator 的实现上没有设计抛出 ConcurrentMo原创 2021-11-01 23:56:06 · 22699 阅读 · 0 评论 -
Java - Java集合中的快速失败Fail Fast 机制
文章目录什么是 fail-fast什么是 fail-fastfail-fast 机制是Java集合(Collection)中的一种错误机制。在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的结构进行了修改(增加、删除),则会抛出Concurrent Modification Exception 【并发修改异常】。举个例子:在多线程环境下,线程1正在对集合进行遍历,此时线程2对集合进行修改(增加、删除), 很容易抛出Concurrent Modification Exception 。当原创 2021-11-01 19:38:24 · 22863 阅读 · 0 评论 -
Java - Jackson JSON Java Parser API
文章目录概述依赖Jackson JSON示例基础数据JSON转换为Java对象Jackson JSON –将JSON转换为Map概述Jackson JSON Java Parser非常流行,并且也用于Spring框架。Jackson JSON Parser API提供了将JSON转换为POJO对象的简便方法,并支持从JSON数据轻松转换为Map。Jackson也支持泛型,并直接将它们从JSON转换为对象。依赖要在我们的项目中使用Jackson JSON Java API,我们可以将其添加原创 2021-03-31 00:32:39 · 13757 阅读 · 7 评论 -
Java - 探究前后分离带来的跨域问题
文章目录为什么会产生跨域问题同源策略为什么会产生跨域问题1995年,Netscape 公司出于安全的考虑在浏览器中引入了“同源策略”。同源策略浏览器端对请求的处理中,如果两个 URL 的协议、域名和端口都相同,我们就称这两个URL 同源我们来举几个例子同源 http://www.xxxx.com/index http://www.xxxx.com/module/path1非同源 http://www.xxxx.com/index https://www.xxxx.com/mo原创 2021-02-12 14:40:10 · 13590 阅读 · 1 评论 -
Java - 从文件压缩聊一聊I/O一二事
文章目录背景问题复现背景有个文件压缩的需求,小伙伴一顿操作猛如虎 , 小文件那是咔咔一顿骚可是突然一个几十兆的文件,跑了100秒还没出来。。。。/** * @author 小工匠 * @version 1.0 * @description: TODO * @date 2021/2/3 16:40 * @mark: show me the code , change the world */public class FileCompress { //要压缩的文件所原创 2021-02-03 22:56:05 · 11433 阅读 · 0 评论 -
Java - String源码解析及常见面试问题
文章目录PreQ1: String 是如何实现的?它有哪些重要的方法?PreJava Version : 主流版本JDK 8Q1: String 是如何实现的?它有哪些重要的方法?看到了吧 , 底层存储是 char 数组public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // the value is used for charact原创 2020-07-07 20:20:35 · 10008 阅读 · 0 评论 -
Java-COW在Java中的应用
文章目录PreJ.U.C 中的COW应用PreLinux-Copy On Write写时复制机制初探J.U.C 中的COW应用原创 2020-05-09 14:45:23 · 9741 阅读 · 0 评论 -
Java-CentoOS 7安装JDK8 (rpm格式 和 tar.gz格式)& 多JDK设置默认的Java 版本
文章目录下载JDK安装 rpm格式的 JDKStep1 rpm -ivh 安装Step 2 配置 & 刷新 /etc/profile安装 tar.gz格式的JDK下载JDK下载页面:戳这里 Java SE Download如果需要历史版本,拖到页面最下方 Java Archive可以看到 安装 rpm格式的 JDKrpm 类似windows 操作系统上的 exe执行文...原创 2019-11-03 18:53:30 · 10662 阅读 · 0 评论 -
Java-JDK动态代理
问题概述改造其他相关接口类问题另一篇博文中的问题性能监视横切逻辑代码概述Java1.3以后,JAVA提供了动态代理技术,允许开发者在运行期创建接口的代理实例。 JDK的动态代理主要涉及java.lang.reflect包中的两个类:Proxy和InvocationHandler.InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑并通过反射机制调用目标类的代码,动态的将原创 2017-08-13 10:48:10 · 14025 阅读 · 0 评论 -
Java-利用Spring提供的Resource/ResourceLoader接口操作资源文件
背景JDK提供的访问资源的类(如java.net.URL、File等)并不能很好地满足各种底层资源的访问需求,比如缺少从类路径或者Web容器上下文中获取资源的操作类。Spring提供了Resource接口,为应用提供了更强的底层资源访问能力,该接口拥有对应不同资源类型的实现类。 资源访问接口主要方法boolean exists() 资源是否存在boolean isOpen() 资源是否打开UR原创 2017-07-08 05:50:38 · 18941 阅读 · 0 评论 -
Java-CGLib动态代理
导读问题CGLib动态代理和JDK动态代理的区别CGLib概述改造导读Spring-AOP基础知识Java-JDK动态代理Java-CGLib动态代理问题另一篇博文中的问题性能监视横切逻辑代码CGLib动态代理和JDK动态代理的区别我们知道使用JDK创建代理时只能为接口创建代理实例。我们从Proxy的newProxyInstance方法中可以看出 @CallerSensitive原创 2017-08-13 13:45:57 · 14173 阅读 · 5 评论 -
Java-并发入门
概述线程的生命周期线程优先级创建线程的两种方式通过实现Runnable接口创建一个线程通过扩展Thread类创建一个线程线程的主要操作Threadstop废弃原因Threadsuspendresume废弃原因线程间通信主要方法实例并发同步并发死锁概述多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当计算机有多个CPU原创 2016-04-13 21:06:32 · 10773 阅读 · 0 评论 -
Java-Java反射
Java反射概述Java语言允许通过程序化的方式间接对Class进行操作。Class文件由类装载器装载后,在JVM中形成一份描述Class结构的元信息对象,通过该元对象可以获知Class的结构信息,如构造函数、属性和方法等。Java允许用户借由这个与Class相关的元信息对象间接调用Class对象的功能, 这就为使用程序化方式操作Class对象开辟了途径。 使用反射不同于常规的Java编程,其中它与原创 2017-07-03 12:41:31 · 12885 阅读 · 0 评论 -
Java-查看JVM从哪个JAR包中加载指定类
背景有的时候,我们经常会碰到java.lang.NoSuchMethodError的错误信息。 究其根源,是由于JVM的 全盘负责委托机制导致的。 关于 全盘负责委托机制 ,请查看另一篇博文 全盘负责委托机制特别是对于一些web项目,jar包很多,如何精确的查找呢?方式一将下面的JSP文件,放到web容器的根路径下,启动web容器,通过 http://ip:port/projectname/原创 2017-07-06 12:05:21 · 20131 阅读 · 0 评论 -
Log4j2-Log4j 2介绍及使用
Log4j 2 官网https://logging.apache.org/log4j/2.x/Log4j 2简介Log4j的1.x版本已经被广泛使用于很多应用程序中。然而,它这些年的发展已经放缓。它变得越来越难以维护,因为它需要严格遵循很老的Java版本,并在2015年8月寿终正寝。它的替代品,SLF4J和Logback对框架做了很多必要的改进。那么为什么还要费心去做Log4j 2呢?几个原因如下:原创 2017-07-15 11:08:39 · 38065 阅读 · 6 评论