java

Java实现手写乞丐版线程池的示例代码

2022-10-16
目录 前言 线程池的具体实现 线程池实现思路 线程池实现代码 线程池测试代码 杂谈 总结 前言 在上篇文章线程池的前世今生当中我们介绍了实现线程池的原理,在这篇文章当中我们主要介绍实现一个非常简易版的线程池,深入的去理解其中的原理,麻雀虽小,五脏俱全. 线程池的具体实现 线程池实现思路 任务保存到哪里? 在上篇文章线程池的前世今生当中我们具体去介绍了线程池当中的原理.在线程池当中我们有很多个线程不断的从任务池(用户在使用线程池的时候不断的使用execute方法将任务添加到线程池当中)里面去拿任务

详解Java如何利用位操作符创建位掩码

2022-10-15
目录 位掩码 举个例子 编码 解码 提取一个比特 第一比特 任意位置的位 提取多个比特 应用一个比特掩码 总结 在本文中,我们来看看如何使用位操作符实现低级别的位掩码.我们将看到我们如何将一个单一的int变量作为一个单独的数据容器. 位掩码 位掩码允许我们在一个数字变量中存储多个值.我们不再把这个变量看作一个整数,而是把它的每一个比特当作一个独立的值. 因为一个比特可以等于 0 或 1,我们也可以把它看成是 false 或 true .我们也可以把一组比特切开,把它们当作一个较小的数字变量甚至是

Java注解之Elasticsearch的案例详解

2022-10-15
学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码.变量之类的玩意,这都是一些和生活常识格格不入的东西.只能多用多练,形成肌肉记忆才行. 在一次实际的产品开发中,由于业务需求的缘故,需要使用Elasticsearch搜索引擎.搜索引擎是通过索引和文档检索数据的,索引类似于MySQL的数据库,而文档类似于MySQL的表.要想使用搜索引擎,就必须事先创建索引和文档. 有两种解决方案可以实现: 第一种方案是把创建索引和文档的语句直接集成在代码里,每次启动时都检查相应的索引.文档是否存在

Spring超详细讲解AOP面向切面

2022-10-15
目录 简介 AOP底层原理 代理概念 JDK动态代理实现 Spring中的AOP 相关术语 AspectJ 实现AOP 不同通知类型实现 相同的切入点抽取 增强类优先级 完全使用注解开发 说明:基于atguigu学习笔记. 简介 AOP(Aspect Oriented Programming)是一种面向切面的编程思想.不同于面向对象里的继承思想,当需要为多个不具有继承关系的对象引人同一个公共行为时,也就是把程序横向看,寻找切面,插入公共行为. AOP目的是为了些把影响了多个类的公共行为抽取到一个

Spring boot 使用QQ邮箱进行一个验证登入功能

2022-10-15
目录 Spring boot 使用QQ邮箱进行一个验证登入 QQ邮箱开启权限 创建发送验证码的请求Controller 注册,登录验证 Spring boot 使用QQ邮箱进行一个验证登入 QQ邮箱开启权限 在QQ邮箱设置->账户里面,往下拉找到这个开启,手机号验证成功后会有一串英文字符串是待会儿要用到的密码. prom.xml 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <ar

详解Java ReentrantReadWriteLock读写锁的原理与实现

2022-10-15
目录 概述 原理概述 加锁原理 图解过程 源码解析 解锁原理 图解过程 源码解析 概述 ReentrantReadWriteLock读写锁是使用AQS的集大成者,用了独占模式和共享模式.本文和大家一起理解下ReentrantReadWriteLock读写锁的实现原理.在这之前建议大家阅读下下面3篇关联文章: 深入浅出理解Java并发AQS的独占锁模式 深入浅出理解Java并发AQS的共享锁模式 通俗易懂读写锁ReentrantReadWriteLock的使用 原理概述 上图是ReentrantR

利用Java工具类Hutool实现验证码校验功能

2022-10-14
目录 Hutool工具类介绍 Hutool实现验证码生成 测试验证码生成 其他样式的验证码 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. 这一篇文章是利用Hutool工具类来实现的,该工具类已经封装验证码所需的相关类等,使用起来较为简单和方便. Hutool工具类介绍 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”.

Spring的同一个服务会加载多次的问题分析及解决方法

2022-10-14
目录 问题现象 问题分析 解决方案 问题现象 最近在本地调试公司的一个Web项目时,无意中发现日志中出现了两次同一个服务的init记录,项目都是基于Spring来搭建的,按理说服务都是单例的,应该只有一次服务加载日志才对,本着对工作认真负责(闲来无事)的态度,必然要一探究竟. 问题分析 为什么同一个 Bean 会被容器初始化两次? 首先,我们先来梳理一下 Web 容器中如何加载 Bean: 在 Web 容器中,ContextLoaderListener 和 DispatchServlet 都会在

springboot各种下载文件的方式汇总

2022-10-14
目录 一.使用response输出流下载 二.使用ResponseEntity 三.注意 总结 一.使用response输出流下载 注意第一种方式返回值必须为void @GetMapping("/t1") public void down1(HttpServletResponse response) throws Exception { response.reset(); response.setContentType("application/octet-stream;ch

Kotlin内存陷阱inline使用技巧示例详解

2022-10-14
目录 引言 错误示例 推荐示例 小结 总结 引言 inline ,翻译过来为 内联 ,在 Kotlin 中,一般建议用于 高阶函数 中,目的是用来弥补其运行时的 额外开销. 其原理也比较简单,在调用时将我们的代码移动到调用处使用,从而降低方法调用时的 栈帧 层级. 栈帧: 指的是虚拟机在进行方法调用和方法执行时的数据结构,每一个栈帧里都包含了相应的数据,比如 局部参数,操作数栈等等. Jvm在执行方法时,每执行一个方法会产生一个栈帧,随后将其保存到我们当前线程所对应的栈里,方法执行完毕时再将此方

图解Java ReentrantLock的条件变量Condition机制

2022-10-14
目录 概述 ReentrantLock条件变量使用 图解实现原理 await过程 signal过程 概述 想必大家都使用过wait()和notify()这两个方法把,这两个方法主要用于多线程间的协同处理,即控制线程之间的等待.通知.切换及唤醒.而RenentrantLock也支持这样条件变量的能力,而且相对于synchronized 更加强大,能够支持多个条件变量. 最好可以先阅读ReentrantLock系列文章: 图解Java ReentrantLock公平锁和非公平锁的实现 详解Java 

详解Java注解实现自己的ORM

2022-10-14
搞过Java的码农都知道,在J2EE开发中一个(确切地说,应该是一类)很重要的框架,那就是ORM(Object Relational Mapping,对象关系映射).它把Java中的类和数据库中的表关联起来,可以像操作对象那样操作数据表,十分方便.给码农们节约了大量的时间去摸鱼.其实它的本质一点都不复杂,而最核心的就是怎么实现对象和表之间的转换.之前对反射和注解有了一点了解,所以就试着来实现咱们自己的缝合怪. 首先,需要建立一个「表格」: /** * 类注解,将类注解成数据库表 * * @aut

一文了解Java读写锁ReentrantReadWriteLock的使用

2022-10-13
目录 概述 ReentrantReadWriteLock介绍 实战案例 验证读读共享模式 验证读写互斥模式 真实缓存例子 概述 ReentrantReadWriteLock不知道大家熟悉吗?其实在实际的项目中用的比较少,反正我所在的项目没有用到过. ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁.它也提供了一把写锁,是独占锁,和其他读锁或者写锁互斥,表明只有一个线程能持有锁资源.通过两把锁的协同工作,能够最大化的提高读写的性能,特别是读多写少的场

Eureka源码阅读Client启动入口注册续约及定时任务

2022-10-13
目录 引言 1.环境 2. Spring Cloud整合Eureka Client 启动入口 2.1 封装配置文件的类 2.1.1 EurekaClientConfigBean 2.1.2 EurekaInstanceConfigBean 2.2 EurekaClient 2.2.1 ApplicationInfoManager 2.2.2 EurekaClient 2.3 小结 3. DiscoveryClient类的解析 3.1 DiscoveryClient 作用 3.2 Discover

Eureka源码阅读解析Server服务端启动流程实例

2022-10-13
目录 环境 1.spring cloud整合eureka server demo 1.1 新建spring boot项目 pom.xml文件添加 配置文件 1.2 启动类 1.3 启动 2. spring cloud自动装配eureka server源码解析 2.1 @EnableEurekaServer注解 2.2 EurekaServerAutoConfiguration 2.2.1 查找starter 自动装配类的技巧 2.2.2 EurekaServerAutoConfiguration

一文搞懂Java并发AQS的共享锁模式

2022-10-13
目录 概述 自定义共享锁例子 核心原理机制 源码解析 成员变量 共享锁获取acquireShared(int) 共享释放releaseShared(int) 概述 这篇文章深入浅出理解Java并发AQS的独占锁模式讲解了AQS的独占锁实现原理,那么本篇文章在阐述AQS另外一个重要模式,共享锁模式,那什么是共享锁呢? 共享锁可以由多个线程同时获取, 比较典型的就是读锁,读操作并不会产生副作用,所以可以允许多个线程同时对数据进行读操作而不会有线程安全问题,jdk中的很多并发工具比如ReadWrite

利用Java手写一个简易的lombok的示例代码

2022-10-13
目录 1.概述 2.lombok使用方法 3.lombok原理解析 4.手写简易lombok 1.概述 在面向对象编程中,必不可少的需要在代码中定义对象模型,而在基于Java的业务平台开发实践中尤其如此.相信大家在平时开发中也深有感触,本来是没有多少代码开发量的,但是因为定义的业务模型对象比较多,而需要重复写Getter/Setter.构造器方法.字符串输出的ToString方法.Equals/HashCode方法等.我们都知道Lombok能够替大家完成这些繁琐的操作,但是其背后的原理很少有人会

SpringBoot使用swagger生成api接口文档的方法详解

2022-10-13
目录 前言 具体例子 maven配置 项目application.yml配置 springApplication添加swagger注解 在控制层添加swagger注解 前言 在之前的文章中,使用mybatis-plus生成了对应的包,在此基础上,我们针对项目的api接口,添加swagger配置和注解,生成swagger接口文档 具体可以查看本站spring boot系列文章: spring boot项目使用mybatis-plus代码生成实例 具体例子 maven配置 在使用之前,我们需要添加s

详解Java中static关键字的使用和原理

2022-10-13
目录 概述 定义和使用格式 类变量 静态方法 调用格式 静态原理图解 静态代码块 概述 关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的.也就是说,既然属于类,就可以不靠创建对象来调用了. 定义和使用格式 类变量 当 static 修饰成员变量时,该变量称为类变量.该类的每个对象都共享同一个类变量的值.任何对象都可以更改 该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作. 类变量:使用 static关键字修

Eureka源码解析服务离线状态变更

2022-10-13
目录 环境 1. 服务离线的方式 1.1 基于Actuator监控器实现 1.2 直接向Eureka Server提交请求 1.3 特殊状态CANCEL_OVERRIDE 2. 服务下架源码 2.1 cancelScheduledTasks() 2.2 unregister() 3. 服务下线源码分析(状态变更) 3.1 变更状态 3.2 获取状态 环境 eureka版本:1.10.11 Spring Cloud : 2020.0.2 Spring Boot :2.4.4测试代码:github.