自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 AQS相关工实现类的使用及其原理

文章目录1、AQS1.1、概述1.2、自定义不可重入锁2、ReentrantLock2.1、非公平锁2.1.1、加锁解锁流程2.1.1.1、加锁失败2.1.1.2、解锁竞争2.2、可重入原理2.3、可打断原理2.3.1、不可打断模式2.3.2、可打断模式2.4、公平锁2.5、条件变量ConditionObject2.5.1、await2.5.2、signal3、读写锁3.1、ReentrantReadWriteLock使用3.2、读写锁原理3.3、StampedLock4、Semaphore4.1、基本使用

2022-02-14 09:00:01 506

原创 ThreadPoolExecutor线程池应用及其原理

1、自定义线程池线程是一种系统资源,每创建一次,都会耗费一定的系统资源,如果是在高并发的场景下,每次任务都创建一个新的线程,那么这样对系统占用是相当大的,甚至会产生内存溢出的问题,而且线程存在的数量也不能太多,如果太多,频繁的上下文切换,也会有很大的负担,处于这两个原因,我们可以充分利用已有的线程,而不是每次创建新的线程#mermaid-svg-Ua0Ai7NnDXUlDBtg .label{font-family:'trebuchet ms', verdana, arial;font-family

2022-02-14 08:58:40 615

原创 不可变类的设计与应用

文章目录1、日期转换的问题2、不可变类的使用3、不可变类的设计1、日期转换的问题@Slf4jpublic class Test { @SneakyThrows public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); for (int i = 0; i < 10; i++) { ne

2022-02-13 20:05:21 486

原创 JUC之无锁并发(乐观锁)

文章目录1、引述2、CAS 与 volatile3、原子整数4、原子引用4.1、AtomicReference4.2、ABA问题4.3、AtomicStampedReference4.4、AtomicMarkableReference5、原子数组5.1、不安全的实现5.2、安全的实现6、字段更新器7、原子累加器7.1、累加器性能比较7.2、LongAdder源码7.2.1、CAS实现锁7.2.2、Cell7.2.3、自增源码跟踪7.2.4、sum8、Unsafe8.1、获取8.2、实现CAS8.3、实现原子

2022-02-13 20:02:26 434

原创 Java内存模型(JMM)

文章目录1、概述2、可见性2.1、退不出的循环2.2、原因分析2.3、解决办法2.4、可见性 VS 原子性3、有序性3.1、概述3.2、原理3.2.1、鱼罐头的故事3.2.2、指令重排优化3.2.3、支持流水线的处理器3.3、诡异的结果3.4、volatile原理3.4.1、保证可见性3.4.2、保证有序性3.4.3、双重检查加锁单例模式1、概述JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM

2022-02-13 20:01:38 1024

原创 多线程设计模式集合

文章目录1、保护性暂停模式1.1、概述1.2、单任务版GuardedObject1.3、多任务版GuardedObject2、生产者消费者模式2.1、概述2.2、代码实现3、终止模式之两阶段终止4、同步模式之犹豫Balking5、双重检查加锁单例模式6、异步模式之工作线程6.1、定义6.2、饥饿6.3、创建多少线程池合适6.3.1、CPU 密集型运算6.3.2、I/O 密集型运算1、保护性暂停模式1.1、概述旨在用一个线程等待另一个线程的执行结果,因为要等待另一方的结果,因此归类到同步模式 有

2022-02-13 20:00:36 1719 1

原创 ReentrantLock使用及其原理

1、简介相对于 synchronized 它具备如下特点 可中断 可以设置超时时间 可以设置为公平锁(可解决饥饿问题) 支持多个条件变量,synchronized 如果没有获取到锁,统一放到 WaitSet 等待(等烟的,等外卖的,统一在一个休息室),而 ReentrantLock 可以包含多个 WaitSet ,分别保存不满足某条件的线程(等烟的和等外卖的分别各自有个休息室) 与 synchronized 一样,都支持可重入基本语法// 获取锁reentrantLock.lo

2022-02-13 19:54:38 882 1

原创 park unpark使用及其原理

文章目录1、基本使用2、对比wait & notify3、原理1、基本使用他们都是 LockSupport 工具类提供的方法,需要先 park 然后再 unpark// 暂停当前线程LockSupport.park(); // 恢复某个线程的运行LockSupport.unpark(暂停线程对象)@SneakyThrowspublic static void main(String[] args) { Thread t1 = new Thread(() -> {

2022-02-13 19:52:55 226

原创 wait notify使用及其原理

文章目录1、API介绍2、原理3、wait和sleep的区别4、正确使用姿势1、API介绍obj.wait() 让进入 object 监视器的线程到 waitSet 等待obj.wait(long timeout) 让进入 object 监视器的线程到 waitSet 等待,但是会有一个时限,不会无限制等待obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒它们都

2022-02-13 19:51:48 198

原创 Synchronized使用及其原理

文章目录1、线程安全问题1.1、问题分析1.2、概念归纳1.2.1、临界区1.2.2、竞态条件2、synchronized1.4、线程八锁问题3、变量的线程安全分析3.1、常见线程安全类3.2、不可变线程安全类3.3、案例分析3.4、卖票问题4、Monitor4.1、Java对象头4.2、Monitor 原理4.3、synchronized原理4.4、轻量级锁4.5、锁膨胀4.6、自旋优化4.7、偏向锁4.7.1、撤销偏向锁4.7.2、批量重偏向4.7.3、批量撤销5、死锁5.1、现象5.2、检测死锁5.3

2022-02-13 19:49:26 442

原创 JUC之线程进程基础

文章目录1、进程和线程1.1、进程1.2、线程1.3、进程和线程之间的对比2、串行和并行2.1、概述2.2、串行并行之间的对比2.3、应用2.3.1、异步调用2.3.2、并行执行3、Java线程3.1、线程的创建3.1.1、Thread3.1.2、Runnable3.1.3、FutureTask3.1.4、Runnable和Thread之间的关系3.2、线程运行的原理3.3、线程上下文切换4、常用方法4.1、run和start4.2、getState4.3、sleep4.4、interrupt4.4.1、打

2022-02-13 19:42:30 232

原创 线程安全类之ConcurrentHashMap

文章目录1、概述2、ConcurrentHashMap2.1、简单应用2.2、JDK 7 HashMap 并发死链2.2.1、问题2.2.2、复现2.2.3、HashMap数据结构概述2.2.4、过程分析2.2.6、jdk8的改变2.3、JDK8 ConcurrentHashMap原理2.3.1、重要的属性和内部类2.3.2、重要的方法2.3.3、构造器2.3.4、get2.3.5、put2.3.6、Size计算流程2.4、JDK7 ConcurrentHashMap原理2.4.1、构造器2.4.2、put

2022-02-13 19:41:16 735

原创 JDK SPI机制以及自定义SPI类加载

概述介绍SPI之前,我们先了解一下为什么要用SPIJDBC相信已经不陌生了,JDBC 是一个标准。不同的数据库厂商(如,mysql、oracle等)会根据这个标准,有它们自己的实现。 既然,JDBC 是一个标准,那么 JDBC 的接口,应该就已经存在于JDK 中了,以前我们在使用JDBC的时候,都是需要加载Driver驱动的,如:Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql:///test";Connection

2022-01-17 14:51:13 2379

原创 扒一扒一致性Hash算法+Java版案例演示

title: 一致性Hash算法与Java实现date: 2022/1/15 15:15:30文章目录一致性Hash算法的应用领域详解一致性Hash算法**hash(key)%**集群节点数一致性Hash算法一致性Hash环虚拟节点手写一个一致性Hash算法一致性Hash算法的应用领域对于一致性Hash算法而言,我们可以在很多地方看到它的身影:RedisNginxDubboElasticSearchHadoop分布式数据库其他分布式数据存储场景…详解一致性Hash算法.

2022-01-15 17:47:24 985 5

原创 JVM类加载与字节码技术

文章目录类加载与字节码技术1、类文件结构1.1、概述1.2、无关性的基石1.3、Class类文件结构1.3.1、魔数magic1.3.2、版本version1.3.3、常量池constant_pool1.3.3.1、标志位说明1.3.3.2、案例结合说明1.3.4、访问标志access_flags1.3.4.1、标志位说明1.3.4.2、案例结合说明1.3.5、包名类名this_class1.3.6、父类super_class1.3.7、接口interfaces_count1.3.8、字段fields1.3

2022-01-07 19:13:31 663

原创 JVM GC调优整理

文章目录GC调优1、预备知识2、GC收集器的选择3、最快的GC是不发生GC4、新生代调优5、老年代的内存调优6、案例6.1、案例16.2、案例26.3、案例3GC调优1、预备知识调优需要掌握GC相关的VM参数,而具体参数可以查看官方文档另外,我们还可以通过命令的方式在本地查看虚拟机运行参数:"D:\jdk1.8.0_121\bin\java" -XX:+PrintFlagsFinal -version | findstr "GC"调优跟应用、环境有关,没有放之四海而皆准的法则2、

2022-01-02 16:54:42 537

原创 JVM GC,收集器,垃圾收集算法实现细节

文章目录GC垃圾回收1、对象已死?1.1、引用计数法1.2、可达性分析算法1.2.1、GC Roots1.3、四种引用1.3.1、强引用1.3.2、软引用1.3.3、弱引用1.3.4、虚引用1.4、生存还是死亡?1.5、finalize方法2、垃圾回收算法2.1、分代收集理论2.2、标记清除2.3、标记复制2.4、标记整理3、分代垃圾回收3.1、相关VM参数3.2、案例演示13.3、案例演示24、HotSpot算法实现细节4.1、准确式内存管理4.2、根节点枚举4.2.1、OopMap4.3、安全点4.4、

2022-01-01 15:54:38 779

原创 JVM内存模型

1、程序计数器1.1、定义Program Counter Register 程序计数器 ,通过计算机CPU的寄存器(速度极快)实现,也是对计算机物理硬件的屏蔽与抽象1.2、作用是记住下一条JVM指令的执行地址二进制字节码(前方的数字可看作指令的地址) Java源代码0: getstatic #20 // PrintStream out = System.out;3: astore_1

2021-12-29 11:51:24 1544

原创 SpringBoot利用WebSocket结合任务调度线程池实现多客户端实时监控同一日志文件

1、前言首先是创建一个SpringBoot工程,我相信读这篇文章的你已经会了,所以直接忽略了;本文的业务逻辑前提如下:对于某一次构建任务,他会产生一个构建执行日志文件,而这一个日志文件可能不止一个客户端会去实时监控,所以我以构建任务的Id作为不同的客户端去查看同一个日志文件的标识2、配置类注入ServerEndpointExpoter,以便后续使用注解开发/** * 首先要注入ServerEndpointExporter,这个Bean会自动注册使用了@ServerEndPoin

2021-12-16 21:33:36 1791

原创 WebSocket整理

文章目录1、WebSocket1.1、介绍1.2、对比HTTP协议1.3、协议头1.4、客户端(浏览器)实现1.3.1、WebSocket对象1.3.2、WebSocket事件1.3.3、WebSocket方法1.5、服务端实现2、聊天室应用练习2.1、注入ServerEndpointExporter2.2、会话连接池2.3、处理WebSocket消息接口2.4、前端页面1、WebSocket1.1、介绍WebSocket是一种网络通信协议,是HTML5开始提供的一种在单个TCP连接上进行全双工通讯

2021-12-16 13:26:28 2893

原创 Log4j2日志框架JNDI注入漏洞分析与复现

1、漏洞背景大家在实际开发中,几乎无可避免的需要用到日志框架,不管你是前端后端客户端,他们可以追踪和记录我们的程序运行中的信息,我们可以利用日志很快定位问题,追踪分析。而对于Java开发人员来说,最常用的日志框架便是Log4j2和logback,而本次漏洞的主角便是Apache Log4j2,它有一个特别强大的功能插件Lookups如果我们试图通过日志去输出一个程序中不存在的对象,而在其他地方,那么我们便可以通过这个插件去通过某些方式去查找目标内容,它只提供一种规范,具体使用哪些方式去查找

2021-12-14 14:43:03 5044

原创 Netty整理

1、概述1.1、什么是NettyGithub仓库官方网站Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目,是一个异步的、基于事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络 IO 程序Netty本质是一个 NIO 框架,适用于服务器通讯相关的多种应用场景Netty 主要针对在 TCP 协议下,面向 Clients 端的高并发应用,或者 Peer-to-Peer 场景下的大量数据持续传输的应用层次关系为:TCP/IP->J

2021-11-30 21:18:47 939

原创 Java BIO/NIO 零拷贝 整理

1、BIO1.1、简介BIO是同步并阻塞(传统阻塞型)的,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销(可以通过线程池机制改善,实现多个客户连接服务器)应用场景:适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序简单易理解。图示Java BIO就是传统的Java IO编程,其相关类和接口都在java.io包中,其开发步骤大

2021-11-23 19:12:03 565

原创 Shiro整合JWT

1、概述Servlet的Session机制流程如下用户首次发请求服务器接收到请求之后,无论你有没有权限访问到资源,在返回响应的时候,服务器都会生成一个Session用来储存该用户的信息,然后生成SessionId作为对应的Key服务器会在响应中,用SessionId这个名字,把这个SessionId以Cookie的方式发给客户(就是Set-Cookie响应头)由于已经设置了Cookie,下次访问的时候,服务器会自动识别到这个SessionId然后找到你上次对应的Session引入Shi

2021-11-13 17:29:08 1744 2

原创 JWT入门指南

1、什么是JWT官网地址JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally s

2021-11-09 15:13:53 121

原创 Shiro入门指南

文章目录1、权限管理1.1 什么是权限管理1.2 什么是身份认证1.3 什么是授权2、什么是Shiro3、Shiro的核心架构3.1、Subject3.2、SecurityManager3.3、Authenticator3.4、Authorizer3.5、Realm3.6、SessionManager3.7、SessionDAO3.8、CacheManager3.9、Cryptography4、Shiro中的认证4.1、认证4.2、Shiro中认证的关键对象4.3、认证流程5、单机Shiro认证5.1、引入

2021-11-06 17:24:14 372

原创 Jenkins任务调度源码简要分析

文章目录一、历史二、正文1、平台基石①、Jenkins2、任务执行①、Item&ItemGroup②、Job③、Run④、Executor&Executable⑤、WorkUnit⑥、AbstractProject和AbstractBuild3、资源设备①、Node②、Label③、Computer4、调度策略①、Queue②、NodeProvisioner转载请注明出处,谢谢一、历史Jenkins是由Java语言编写的一款开源的持续集成的工具,前身为Sun公司的Hudson,众所周

2021-10-29 11:16:52 2455

原创 Jenkins插件开发官方Demo

准备工作因为Jenkins是基于 Java开发的,插件开发首先需要安装JDK和MavenMaven安装完成后,需要修改配置文件,内容如下<settings> <pluginGroups> <pluginGroup>org.jenkins-ci.tools</pluginGroup> </pluginGroups> <profiles> <!-- Give ac

2021-10-21 14:41:56 1019

原创 Jenkins API 自定义适配多配置Matrix类型任务

一、前言这段时间参与的Devops平台需要对接Jenkins平台,以java方式调用Jenkins API达到对Jenkins平台上面的若干任务进行管理,官方Jenkins-client下面只提供了FreeStyle风格(也就是普通任务类型)和Maven风格的任务API,并未提供多配置类型的任务的API,所以就对比源码和API文档,仿照写了一份,也能够拿到任务的构建历史,任务配置信息,还有构建归档的文件等等。所以在此记录一下二、API1、AllMatrixBuilds/** * @author

2021-10-21 14:39:12 525

原创 Java调用Jenkins API获取任务构建归档文件

基础API示例移步另一篇博客准备工作/** * @author PengHuAnZhi * @ProjectName Jenkins API Demo * @Description Jenkins连接工具类 * @time 2021/10/8 14:33 */public class JenkinsConnectFactory { private static final String JENKINS_URL = "http://192.168.225.130"; priva

2021-10-13 21:07:45 974

原创 Java使用Jenkins API操作任务,视图,部署等

文章目录1、什么是Jenkins API2、Jenkins API分类①、JSON API②、XML API③、Python API④、其他3、使用Java调用Jenkins API①、ViewⅠ、创建ViewⅡ、获取ViewⅢ、获取View配置 XML 信息Ⅳ、更新ViewⅤ、删除View②、JobⅠ、创建JobⅡ、更新JobⅢ、获取Job基本信息Ⅳ、获取Maven Job信息Ⅴ、获取Job列表Ⅵ、根据View名称获取Job列表Ⅶ、查看Job XML信息Ⅷ、无参数 Job buildⅨ、有参构建Ⅹ、停止最

2021-10-08 17:51:19 3198 1

原创 一文搞定Git以及IDEA集成Github

Git基础命令1、设置用户签名签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。首次安装必须设置,否则无法提交代码。这里设置的用户签名和代码托管中心的账号没有任何关系git config --global user.name PengHuAnZhi#Git并不会验证此邮箱,也不会去校验邮箱的真实性git config --global user.email [email protected]、初始化本地库定位到项目根目录

2021-10-04 19:01:17 273

原创 基于CentOS8,从0开始搭建Jenkins+GitLab+Maven持续集成,自动构建SpringBoot项目案例

一、环境准备创建三台虚拟机服务器名操作系统IP说明GitLabCentOS 8192.168.225.129部署GitLabJenkinsCentOS 8192.168.225.130部署JenkinsServerCentOS 8192.168.225.131部署Maven二、GitLab服务器环境搭建①、安装基础依赖#安装基础依赖sudo yum install -y curl policycoreutils-python-util

2021-10-04 10:27:19 650

原创 JDK8新特性

一、集合处理数据的弊端当我们在需要对集合中的元素进行操作的时候,除了必需的添加,删除,获取外,最典型的操作就是集合遍历,看一段代码public static void main(String[] args) { // 定义一个List集合 List<String> list = Arrays.asList("张三", "张三丰", "成龙", "周星驰"); // 1.获取所有 姓张的信息 List<String> list1 = new Ar

2021-09-29 19:36:27 218

原创 浅谈跨域问题,以及跨域问题如何处理

一、概述我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来。①、什么是跨域跨域(CORS)是指不同域名之间相互访问。指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。②、什么情况会跨域同一协议, 如http或https同一IP地址, 如127.0.0.1同一端口, 如8080以上三个条件中有一个条件不同就会产生跨域问

2021-09-28 15:22:45 591 1

原创 SpringBoot集成Swagger2

官网:https://swagger.io/一、快速开始本文基于SpringBoot项目集成Swagger①、建项目②、相关依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>

2021-09-27 17:38:46 160

原创 MyBatis Plus入门使用教程

一、概述①、简介MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生②、特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用

2021-09-25 21:09:49 2143 1

原创 剑指offer部分解

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。代码实现Stack<Integer> stack1 = new Stack<Integer>();Stack<Integer> stack2 = new Stack<Integer>();public void push(int node) { /* * 判断stack2中元素是否为空,不为空的情况就是在pop操作中将stack1的元素po

2021-03-14 09:32:40 157

原创 23种设计模式

创建型模式,共五种工厂方法模式抽象工厂模式单例模式建造者模式原型模式结构型模式,共七种适配器模式装饰器模式代理模式门面(外观)模式桥接模式组合模式享元模式行为型模式,共十一种策略模式模板方法模式观察者模式迭代子模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式(用的实在太少,略)...

2021-03-10 15:17:00 408

原创 鸿蒙自定义一个GifImage组件

创建一个空的工程在这个空工程下创建一个空的Module,指定Module为一个HarmonyOS library,Module名称为Gif新建一个Gif类,继承自Image类package com.example.timestory.slice.Utils;import com.example.timestory.slice.Utils.decoder.GifDecoder;import ohos.agp.animation.Animator;import ohos.agp.a.

2021-03-02 20:25:39 969 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除