自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux从入门到放弃-CentOS 7安装Docker

Docker是基于Golang语言开发的一个开源应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器并发布到任何Linux服务器上。容器是沙箱机制,相互之间不会互相影响,并且容器开销相对更低。容器与虚拟机的区别在于虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,容器技术是与宿主机共享资源及操作系统可实现动态分配的资源,容器包含应用和其想要的依赖,但是与其它容器共享内核。本文主要详述在CentOS 7系统中,安装docker并使用。

2022-10-24 21:00:37 854

原创 JAVA实现多邮件服务器发送邮件

在日常开发中,可能会遇到这样的开发需求:一些告警消息或者通知消息会使用邮件发送(针对一些消息重要但是对消息实时性要求不是特别高的场景),然而一些企业可能会有多个邮件服务器,每个邮件服务器每天只能发送指定数量的邮件,如何合理高效利用这些邮件服务器是开发者需要重点考虑的。由于SpringBoot项目对JavaMail进行了封装,方便开箱即用,然而此方案的缺陷在于只能配置一个邮件服务器地址,无法满足本文的需求。本文将基于上述需求,设计实现一种多邮件服务器发送邮件的功能,方便大家参考学习。

2022-10-10 15:21:52 3607

原创 JAVA多线程进阶篇-Condition和Signal

Condition是JAVA1.5中出现的,它的作用是对原生的wait()、notify()/notifyAll()方法进行增强,相对于传统的wait()和notify()方法,Condition中的await()和signal()这种方式实现线程中协作更加高效。Condition是一个接口,主要依赖于JUC中的Lock接口,它的await()、signal()方法都要在lock同步锁内完成,也就是该部分代码必须存在于lock.lock()、lock.unlock()之间。

2022-09-28 22:32:07 2237

原创 JAVA多线程基础篇-AQS(AbstractQueuedSynchronizer)

AQS(AbstractQueuedSynchronizer)抽象队列同步器,是一种用来构建锁和同步器的框架。在JAVA,AQS是其它同步组件的基础框架(ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock、SynchronusQueue等),它是JUC并发包中的核心组件。它不仅解决了在实现同步器时涉及的大量细节问题(自定义标准同步状态、FIFO同步队列等),还充分考虑了伸缩性,降低了上下文开销、提高了吞吐量。

2022-09-26 11:32:53 3753

原创 小侃设计模式(十二)-代理模式

代理模式是结构型设计模式的一种(23种设计模式),它是底层框架使用较多的一种设计模式(Spring、Mybatis等)。代理模式指的是在某些场景下,对象会找一个代理对象,来辅助自己完成一些工作,这些工作是对原对象行为的控制或增强。举个简单的例子:有一个明星类(Star),日常的主要工作是演戏和唱歌,而她需要一个经济人(StarManager)来帮她代理一些事情,比如演戏和唱歌前的预约、结束后的收费等等。...

2022-08-31 17:02:04 357

原创 JAVA多线程进阶篇-探索线程池ThreadPoolExecutor源码

JAVA线程池是一种基于池化思想的线程管理工具,它能够控制线程运行的数量。在线程运行中,线程过多会带来额外的开销,其中包括创建销毁线程的开销,操作系统调度线程的开销等,若频繁创建大量线程、销毁线程,会极大地降低计算机地整体性能。线程池技术能够维护指定数量线程,且根据线程数量安排执行数量。这种做法的优势是降低创建和销毁线程的代价,另一方面避免同一时间创建大量线程导致计算机资源消耗,程序运行异常。本文将分析JAVA线程池的使用及底层实现原理,帮助大家更好地理解该技术。

2022-08-23 23:06:19 273

原创 JAVA基础之安全删除可变数组元素

在JAVA开发中,经常需要存储一些元素到可变数组List中,数组删除元素时,有一些基本注意事项,否则会导致元素删除失败或操作异常,本文将详细说明如何避免这种情况。

2022-08-21 17:26:46 680

原创 JAVA基础之int[]数组逆序排序

有一个int[],数组内有一定数量的元素,将该数组内元素按逆序排序,解析所使用方案的优缺点。假定数组int[] arrs={5,1,6,3,4,9,22,65,77}。

2022-08-13 22:15:56 9381 1

原创 JAVA多线程基础篇-join方法的使用

join()是Thread类的一个方法,根据jdk文档的定义,join()方法的作用,是等待这个线程结束,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行。通常用于在main主线程内,等待其它调用join()方法的线程执行结束再继续执行main主线程。本文将探索join方法的使用方式和使用原理。.....................

2022-07-31 22:46:35 8595

原创 JAVA多线程基础篇-类ThreadLocal

ThreadLocal类是JDK1.2中提供的一个类,它是解决多线程并发程序的一个类。它能够提供线程内的局部变量,使得不同线程之间变量不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数组件之间一些公共变量传递的复杂度。在大部分场景下,使用ThreadLocal比直接使用synchronized解决线程安全问题更简单和方便,本文将探索ThreadLocal的具体使用方式和底层原理。.................................

2022-07-31 22:40:17 883

原创 JAVA多线程基础篇-线程通信(wait/notify)

在JAVA多线程中,线程通信是重要概念之一。线程通信能够使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各线程在任务处理过程中进行有效把控。本文将针对使用wait/notify进行线程之间通信进行分析,详述其实现过程、原理以及相关注意事项。.........

2022-07-10 20:29:56 2053

原创 JAVA多线程基础篇-关键字synchronized

syncronized是JAVA多线程开发中一个重要的知识点,涉及到多线程开发,多多少少都使用过。那么syncronized底层是如何实现的?为什么加了它就能实现资源串行访问?本文将基于上述问题,探索syncronized的用法及原理。由于本节知识涉及到JMM相关知识,具体可查看上一篇文章JAVA多线程基础篇-关键字volatile。由上表可知,synchronized的具体功能包括:锁方法、锁对象和锁代码块。1.概念一个线程可以多次执行synchronized,重复获取同一把锁。2.案例运行结果如下

2022-06-27 19:31:23 668

原创 JAVA从入门到放弃之函数式编程

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!函数式编程最早是数学家阿隆佐·邱奇研究的一套函数变换逻辑,又称Lambda Calculus(λ-Calculus),所以也经常把函数式编程

2022-06-21 13:03:53 665

原创 SpringSecurity从入门到放弃之JWT认证登陆(一)

1.概述Spring Security是一个高度自定义的安全框架,它利用Spring IoC和AOP的特性,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码,使代码更加高内聚、低耦合。Spring Security作为Spring 家族的一员,与Spring MVC及其它Spring框架能很好地集成。本文将展示Spring Security整合JWT实现登陆和退出等功能,以及解释一下其运行原理。2.案例2.1 基础概念2.1.1 什么是认证当访问一个系统时(应用),输入账户名

2022-05-26 15:18:43 1714

原创 JAVA多线程基础篇-关键字volatile

1.概述volatile是java多线程中一个常见的关键字,面试中被问的频率也比较高。那么volatile的作用是什么?以及其实现原理是什么?本文将基于上述问题,结合一些具体案例来分析volatile的作用以及实现原理,来帮助大家更好地理解volatile。2.案例分析...

2022-05-16 22:33:28 1993

原创 JAVA从入门到放弃之JVM内存高占用问题排查

1.概述JVM作为是JAVA中重要的基石,是java编程人员进阶路上的必需了解内容。为了帮助大家快速了解一些JVM的相关知识,本文将基于一个JVM案例(内存占比较高,调用垃圾回收方法后,内存占比仍然很高),来分析类似问题的解决方案以及排查思路。2.JVM高内存占用案例首先大概讲一下这个案例的基础现象:3.小结4.参考文献5.附录...

2022-05-06 23:32:32 6321

原创 SpringCloud从入门到放弃之链路追踪三(Sleuth+Zipkin+Logback+ELK)

1.概述2.Sleuth+Zipkin+ELK整合3.小结4.参考文献5.附录

2022-04-19 20:43:07 2926

原创 SpringCloud从入门到放弃之链路追踪二(Sleuth+Zipkin+Kafka+Logstash)

1.概述2.链路数据存储2.1 Kafka

2022-04-19 15:25:35 3222

原创 SpringCloud从入门到放弃之链路追踪一(Sleuth+Zipkin)

1.概述”链路追踪“一词首次在google的Dapper论文中出现,该论文介绍了google自研的分布式链路追踪的实现原理,还介绍了他们是怎么低成本实现对应用透明的。Dapper论文一开始介绍的只是一个独立的链路调用系统,后来逐步演化成了监控平台,并且基于监控平台衍生出了许多工具,比如实时预警、过载保护等。单纯的理解链路追踪,就是记录一次请求开始到结束,期间所调用的系统及耗时都能被完整的记录下来。 现在所说的链路追踪系统,都是具有一套相对比较完整的功能,不仅具备记录功能,还具备一大堆衍生功能,让人能够更清

2022-04-11 21:03:41 3606

原创 SpringBoot从入门到放弃之日志配置

1.概述2.sl4j使用2.1 SpringBoot默认日志系统2.2 其它日志框架转换sl4j2.3 SpringBoot中日志框架切换3.小结4.参考文献5.附录

2022-03-27 23:35:42 1347

原创 跨域解决方案-基于Nginx的反向代理配置

1.概述上篇讲述了关于跨域的后端解决方案,本文将展示利用反向代理服务器nginx,来解决跨域问题。闲话少说,直接开干!2.基于Nginx反向代理配置首先讲一下利用nginx反向代理的原理:前端不直接请求后端服务,而是通过nginx去转发请求,也就是前端请求nginx,在nginx配置中添加允许跨域请求的配置,这样由nginx转发后的请求便能读取到后端服务数据,再返回给前端。流程如下图所示:本文将基于上文案例进行修改,具体可参考上文:SpringBoot从入门到放弃-跨域问题解决方案,具体修改的内容

2022-03-21 23:18:53 4521

原创 SSO单点登录-基于cookie的单点登录

1.概述单点登录(Single-Sign-On),简称SSO,它的解释为:在多个应用系统中,只要登陆一次,便可以访问其它相互信任的系统。早期系统由于只有一个服务,因此只需要登录一次,就可以访问系统的其它资源。伴随着业务的发展和用户数量的增加,单系统局限性越来越突出(无法支撑大规模用户、用户数量过多系统卡顿等)。为了增强系统的并发能力和解耦合,进行了系统业务的拆分,系统业务拆分后,为了保护系统之间数据安全性,用户需要登录认证才能进行资源访问。若资源分散在不同的服务上,每访问一次都需要重新登录,这会极大地降低

2022-03-19 22:10:06 3097

原创 JAVA阻塞队列-ArrayBlockingQueue

1.概述在JAVA中,阻塞队列算起来共有7种(如下图所示)。数组阻塞队列(ArrayBlockingQueue) :底层基于数组的有界阻塞队列,初始化时需要指定队列大小;链表阻塞队列(LinkedBlockingQueue) :以链表来存储元素,理论上只要存储空间够大,就是无界的;同步阻塞队列(SynchronousQueue):队列中不存储元素,队列中放入元素后,只有该元素被消费完成,才能重修放入元素;优先级无界阻塞队列(PriorityBlockingQueue):底层基于数组的无界队列,支

2022-02-13 23:26:05 5381

原创 JAVA多线程基础篇--Callable与FutureTask

1.概述2.实战演练3.代码分析4.小结5.参考文献

2022-01-20 09:03:40 3325 1

原创 JAVA retry:源码分析

1.概述今天在阅读FutureTask的源码时,读到下面一段代码,百思不得其解。若说是个全局变量吧,又没有声明,局部也没有声明,而且retry又不是Java关键字,这种写法之前也没见过。于是Google了一些资料,终于了解了它的作用,特意写出来与大家分享。2.代码分析2.1 解释retry:其实就是个标记位,标记程序跳出循环之后从哪里执行,类似于C语言中的goto语句。retry:一般都是伴随for循环语句出现的,retry:下一行跟的就是for循环语句,在for循环里面调用continue r

2022-01-11 20:21:49 714

原创 JAVA多线程基础篇--线程终止(Interrupt与stop)

1.概述日常业务中,可能会遇到这样一个场景:终止一个正在运行的线程。停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。优雅地停止线程是java开发中比较重要的技术点,因此需要一些技巧。本文将基于多线程停止的几种方式来进行分析,并对比各种方式的优劣。2.线程停止的几种方法首先要了解JAVA中终止正在运行线程的三种方法:2.1 调用Thread.stop()方法来强行终止线程这种方式是不被推荐的,因为stop()、suspend()与resume()都是作废过期的方法,使用

2021-12-20 13:59:55 2390 1

原创 JAVA多线程基础篇--守护线程(Daemon Thread)

1.概述JAVA中的线程主要分为两类:用户线程(User Thread)和守护线程(Daemon Thread)。JAVA语言中无论是线程还是线程池,默认都是用户线程,因此用户线程也被称为普通线程。守护线程也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当线程中的用户线程都执行结束后,守护线程也会跟随结束。守护线程具有自动结束生命周期的特性,而非守护线程则不具备该特性。本文将编写一些案例,同时根据源码来对用户线程和守护线程进行分析,帮助大家更好地理解。2.守护线程分析2.1 案例分析上面讲

2021-12-16 20:08:51 12511 2

原创 Semaphore小述

1.概述Semphore(信号量)是一种线程同步工具,它主要用于多个线程对同一个资源进行并行操作,合理并发占用有限的公共资源。Semaphore可以理解为管理一组数量固定许可证的机构,当有大量线程来请求资源时,Semaphore会给一部分线程许可证,拿到许可证的线程才能访问资源,访问结束后归还许可证给Semaphore,Semaphore继续将证书发给排队的一个个线程;使用Semaphore可以控制并发资源的线程个数。本文将通过案例对Semaphore进行演示,并通过源码进行分析,从而全面展示Semaph

2021-12-07 17:14:12 869

原创 CAS小述

1.概述CAS(Compare And Swap)比较并交换,它是一种乐观锁的实现方式。其作用是让CPU比较内存中某个值是否和预期的值相同,如果相同则将这个值更新为新值,不相同则不做更新,也就是CAS是原子性的操作(读和写两者同时具有原子性),由于其底层是基于C/C++实现,因而具有很高的性能。本文首先会介绍CAS的基本思想以及相关基础知识(乐观锁和悲观锁),其次讲解一个小案例来进一步阐述CAS思想,最后分析CAS源码,让读者对CAS有更进一步的了解。2.基础原理解释2.1 乐观锁(非互斥同步锁)2

2021-09-26 22:31:41 199

原创 CountDownLatch小述

1.概述countDownLatch是一个多线程同步工具类,这个工具经常用来用来协调多个线程之间的同步,能够实现线程之间的通信(协作式、非互斥)。它能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。它相当于是一个计数器,这个计数器的初始值就是线程的数量,每当一个任务完成后,计数器的值就会减一,当计数器的值为 0 时,表示所有的线程都已经任务了,然后在 CountDownLatch 上等待的线程就可以恢复执行接下来的任务。本文将从源码来分析countDownLatch的实现原理,并通过一个小案例

2021-09-08 21:15:20 346

原创 CyclicBarrier小述

1.概述CyclicBarrier是JUC包中一个同步工具类,它能够保证一组线程相互等待,直到所有线程到达同一屏障点,再进行下面的操作。本文将通过剖析CyclicBarrier源码以及分析其使用场景,来进一步展示CyclicBarrier。2.CyclicBarrier原理解析2.1 构造方法 public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new I

2021-08-31 14:45:45 128

原创 HashMap、Hashtable、ConcurrentHashMap的区别

HashMap、Hashtable、ConcurrentHashMap是日常开发中使用频率较高的数据结构,它们都是以key-value的形式来存储数据,且都实现了Map接口,日常开发中很多人对其三者之间的区别并没有十分清晰的概念。本文将剖析部分源码,以及从线程安全性、速度等方面来分析三者之间的区别。首先讲下三者的一些区别:1.HashMap与Hashtable基本上等价,区别在于Hashtable的大部分方法都是被synchronized修饰,并且键值都不能为null(HashMap则可以);...

2021-08-29 15:20:48 5870 1

原创 ArrayList、Set线程不安全解决方案

1.概述在日常开发中,ArrayList、Set在大量的场景下使用,然而我们都知道ArrayList和Set是线程不安全的,那么为什么ArrayList和Set是线程不安全的?如何保证在高并发场景下其线程安全性呢?本文将通过以下案例来剖析ArrayList、Set线程不安全的原因及现象,以及避免线程不安全的几种方案,并通过分析源码来阐述为什么这些方案能保证线程安全。2.测试及解决方案2.1 关于ArrayList的测试代码public class ArrayListTest { public

2021-08-16 22:12:12 696

原创 Springboot从入门到放弃之邮件发送

1.概述日常开发中,消息通知是比较常见的一种功能。比如在你购买完火车票之后,会给你发送一条短信;再比如某些网站你登陆后,会给你发一封确认邮件,等等等等。还有一些特殊场景,需要告警信息推送功能,来及时发现并解决一些问题。本文将基于springboot环境,实现邮件发送功能,并基于此功能,实现一个有意思的案例,加强应用性。2.发送邮件功能实现3.一个让女朋友爱到不能自拔的案例4.小结...

2021-05-27 20:25:59 1350 3

原创 Spring从入门到放弃之基于AOP的日志统计方案

1.概述在日常开发中,数据安全一般也是企业关注的重点问题,因此对于数据的操作记录也是关注的重点对象。采集操作日志也成为企业生产中必不可少的一环,如何在不影响业务且不需要新增大量记录日志的代码就能实现日志记录的功能,一直是企业所探索的方案。本文将详细分析利用Spring AOP特性,在不影响业务且不需要新增多余代码的前提下,实现该功能。同时基于Servlet拦截器的功能,实现同样的功能。最后分别对比方案的优劣,并提供有效代码供大家学习。2.基于AOP日志统计方案3.小结4.参考文献5.源码地址ht

2021-05-01 23:27:10 304 3

原创 JAVA中List内元素几种排序方式以及效率对比

1.概述在日常开发中,获取一批数据后,可能需要跟据一定规则对这批数据进行排序操作。在JAVA中,动态数组ArrayList经常被用来存储数据,因此如何高效对ArrayList中元素进行排序,形成符合条件的数据集是日常开发必须要考虑的问题。本文将分析常用ArrayList排序的几种方式,包括集合框架提供的Collections.sort方法、实现Comparable接口、以及JAVA 8 stream流中提供的排序方法,同时对比同一条件不同数据集大小的排序性能。2.按条件排序几种方案及性能对比2.1 利

2021-04-26 17:26:58 3079 2

原创 多线程从入门到放弃之线程统计结果方案

1.概述基于上文《Redis从入门到放弃之Redis key过期监听》中的应用实例中,无法进行大批量数据的上报。因此决定采用多线程来进行解决,给每台设备单独开启一个上报线程,同时指定线程开关,能够跟据需要来关闭线程,设备的配置信息放置于缓存中,每次处理完成数据后,重置下一次的处理时间,进而达到定时上报的效果。本文将基于上述思路,进行业务实现解决。2.方案实现2.1 方案一方案一的实现思路如下:跟据每台设备的唯一标识(设备号)开启一个线程,该线程会不断去获取缓存中的配置,配置中包含该条设备下一次的上

2021-03-24 20:12:25 321

原创 SpringBoot从入门到放弃之注解@Async

1.概述在使用@Async注解之前,首先需要了解同步调用和异步调用的区别。同步调用指的是一个方法内部可能有几个不同的方法,按照从上到下的顺序依次执行。如下图中代码所示,方法init中分别有method1()、method2()、method3()三个方法,这三个方法按照顺序依次执行。异步调用指的是init()方法中的method1()、method2()、method3()执行顺序无明确先后关系,也就是说加上@Async注解后,该方法就变为异步调用。该注解应用的场景主要为:(1)某一方法不需要立即执行,也

2021-03-12 17:27:13 759

原创 Redis从入门到放弃之Redis key过期监听

1.概述Redis是一个高效的key-value数据库,同时拥有很多较为强大的功能。针对redis的过期key,可以来实现一些业务,这些业务的共性是不需要较高的实时性。Redis的过期事件可能会存在延迟,所以它无法实现实时性较高的功能。本文主要讲述的是跟据过期事件,实现数据统计与上报的功能。2.监听事件的两种实现2.1 业务背景本文中所讲述的场景主要是:一个服务下面有多台应用设备,设备会定时上报一些数据,此服务需要跟据上报数据定时计算得出一个结果,并将结果进行上报到中心服务进行持久化操作。设计方案

2021-03-02 19:51:03 1516 2

原创 nginx从入门到放弃-静态服务器的搭建

1.概述

2020-12-14 20:37:18 214

空空如也

空空如也

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

TA关注的人

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