- 博客(84)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入理解ThreadLocal:拨开迷雾,探究本质
ThreadLocal是JDK1.2提供的一个工具,它为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,解决共享参数的频繁传递与线程安全等问题。如果开发者掌握了ThreadLocal用法与原理,那么使用起来将得心应手,那么请跟随本文的节奏,拨开迷雾,探究本质吧!本文将带领读者深入理解ThreadLocal,为了保证阅读质量,我们可以先一起来简单理...
2020-03-31 00:32:20
1841
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 深入理解队列:LinkedBlockingQueue源码深度解析
队列这个词对于大家来说并不陌生,大家都参加过军训,教官会要求大家站成一个队列,从队列头报数到队列尾。这个例子是来自生活,当然,在编程世界里面,队列的应用也十分广泛,比如线程池、消息队列等,底层原理都是使用的队列的思想。本文将深度解析LinkedBlockingQueue的源码,它是JDK提供的一个队列实现,本文以JDK8的版本为例。一、LinkedBlockingQueue的组织关系Lin...
2020-03-26 21:41:35
687
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一篇文章深入理解分布式锁
分布式应用经常会遇见并发问题,如果并发问题处理不好,会产生数据的异常问题,这是一个程序的致命问题,所以对于并发问题,必须的设计一个好的方法来处理它,分布式锁就是解决并发问题的一个比较常用的手段。一、并发问题的引入假设这里有一个分布式应用,它拥有多个客户端,每个客户端都会对存储在Redis中的数据进行计算并修改,计算的前提是获取到最新的数据,然后进行计算,最后写回Redis。在一个不存在并发...
2020-03-15 20:47:33
897
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一篇文章深入理解JDK8 HashMap
笔者在上一篇文章《深入理解JDK7 HashMap》中详细解析了HashMap在JDK7中的实现原理,主要是围绕其put、get、resize、transfer等方法,本文将继续解析HashMap在JDK8中的具体实现,首先也将从put、get、resize等方法出发,着重解析HashMap在JDK7和JDK8中的具体区别,最后回答并解析一些常见的HashMap问题。在阅读本篇文章之前,建议阅读...
2020-02-17 22:29:38
1872
11
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 一篇文章深入理解JDK7 HashMap
在日常开发中,集合作为存储数据的容器,被广泛使用在程序代码中,本文将从JDK集合类代表HashMap出发,着重理解HashMap底层实现。一、Map家族关系图在正式讨论HashMap之前,我们有必要把Map家族的继承实现关系展示出来,方便理解后续的内容。上图很详细地展示了Map家族中各个成员之间的继承或者实现关系。Map接口是双列集合的顶层父接口,该集合中每个元素都是键值对key-va...
2020-02-11 22:21:35
2118
10
原创 【甘泉算法】一文搞定“岛屿类”问题
leetcode上有许多非常有意思的题目,“岛屿类”问题绝对算得上有意思的题目,这些题目解决起来可能有点棘手,但是如果可以独立思考解决它,还是很锻炼人的思维能力的。其实这类“岛屿类”问题就是DFS(深度优先搜索)的应用,本文将结合leetcode上几道经典的题目,和大家一起来讨论讨论。一、例题列表这里列出本文需要解决的几道题,如下所示:序号题目难度1No.200 岛屿数量中等2No.462 岛屿的周长简单3No.695 岛屿的最大面积中等4No.
2021-08-28 00:57:57
398
原创 【甘泉算法】一文搞定还原二叉树问题
二叉树是一个重要的数据结构,学习好二叉树很重要,本文将借助leetcode三道练习题,从前序+后序、前序+中序以及中序+后序三种遍历组合方式来还原二叉树。一、二叉树的遍历首先我们一起来温习下二叉树的三种遍历方式:前序遍历、中序遍历、后续遍历。如果读者不太了解这三种遍历方式,建议找点博客看看二叉树的三种遍历,本文主要是借助二叉树的遍历结果来还原二叉树,所以本文默认读者是了解二叉树的遍历的。首先我们一起看下二叉树的三种遍历方式,如下图所示一棵二叉树:三种遍历结果如下所示:三种遍历方式的区别是:.
2021-07-10 20:52:13
2193
8
原创 【甘泉算法】一文搞定单调栈问题
栈(stack)是一种特殊的数据结构,但也是一种容易理解的数据结构,它的特点就是先进后出,生活中有很多栈的例子,比如装乒乓球的直筒,最先进入的球到达桶底,然后一个一个进入,最后进入的球在出桶的时候是第一出来,最先进去的是最后一个出来。本文所提到的单调栈其实就是在普通栈的基础上加上了单调的特性,栈内元素保持单调递增或者单调递减的特性。一、单调栈解决的问题本文主要利用单调栈来解决leetcode上的典型问题,其实它的应用范围倒是不广,主要解决的都是类似于leetcode上下一个更大元素的问题,本文将从这.
2021-06-19 23:34:23
655
3
原创 RocketMQ源码之路(二)NameServer路由中心源码分析
一般了解RocketMQ的读者都知道,NameServer是RocketMQ的组织协调者,是RocketMQ对外提供服务的“大脑”。NameServer提供了路由管理,服务注册与服务发现等机制,是保证消息正确地从生产者到消费者的“指挥官”。那么,生产者生产的消息是如何正确地被消费者消费的呢?Broker的宕机是如何被生产者和消费者感知的呢?RocketMQ对外提供服务的可靠性是如何保障的呢?带着这几个问题,我们一起去深入了解RocketMQ NameServer的设计原理及实现吧!一、NameSer..
2020-10-31 20:35:27
553
1
原创 RocketMQ源码之路(一)搭建RocketMQ源码环境
提到消息队列(Message Queue),大家都会想到常见的那几种,比如:Kafka、RabbitMQ、RocketMQ、ActiveMQ、ZeroMQ、MetaMQ等,当然还有很多企业内部自研了适用于公司业务的MQ系统。作为分布式系统的重要组件,MQ常用于系统间的解耦,以及削峰填谷、异步处理等场景。我们学习MQ,不仅要学会如何去使用,更要深入学习MQ的设计思想,以及MQ的实现原理。上述常见的MQ组件中,笔者推荐大家对阿里巴巴的RocketMQ进行深入学习,它是Java语言实现,并且经历了“双十一”巨..
2020-09-26 00:27:33
1046
原创 深入理解类加载机制:拨开迷雾见真章
Java语言将封装性表现的淋漓尽致,程序员在写Java代码的时候根本不用考虑自己写的代码在后期运行时是如何被JVM加载到内存中的,但是想告别CRUD,进阶为一名高级程序员的话,JVM的类加载机制必须了然于心,本文将详解JVM的类加载机制,文中涉及的代码均为JDK8版本,所涉及的Java虚拟机均指HotSpot。一、理解类加载机制我们平常写的Java代码是存储在.java文件中,这是一个文本文件,是不能直接执行的,但是这个文本文件可以被编译成为一个字节码文件(后缀为.class),这个字节码文件中描..
2020-08-31 20:19:30
589
1
原创 走进高并发(四)深入理解Atomic类
从本篇文章开始,我们将对JDK并发包java.util.concurrent中相关类的源码进行分析,通过分析源码,能让我们尽快地掌握并发包中提供的并发手脚架,能让我们更好地利用这些并发工具写出更加好的代码。本篇文章的主角是AtomicInteger,接下来,请跟随文章的节奏一起分析AtomicInteger吧!...
2020-07-04 11:12:12
3170
原创 走进高并发(三)深入理解Java内存模型
多线程程序要比单线程程序复杂的多,单线程程序中,线程从内存中读取一个变量,如果这个变量的值本身就是1,那么线程读取到的值必然是1。但是在多线程程序中,如果多线程对变量的读写没有进行合理的控制,那么后续线程读取到的变量的值很可能是2,甚至是3等。所以有必要定义一种或多种规则,保证多线程下内存数据的一致性和准确性,Java内存模型(Java Memory Model,JMM)由此诞生。在讨论Java内存模型之前,这里先一起聊聊CPU、高速缓存以及主内存,在了解这些知识后,对理解Java内存模型会有很大的帮.
2020-06-22 20:04:00
591
原创 Spring Security技术栈学习笔记(三)表单校验以及自定义校验注解开发
Hibernate不仅仅为操作数据库提供了解决方案,还为数据校验提供了解决方案——Hibernate Validator。本篇博客将介绍常用的Validator注解的使用以及在Validator不满足实际需求的情况下如何使用自定义Validator来实现数据校验。一、常见的数据校验注解首先我们需要在项目的POM文件中添加Hibernate Validator的依赖才可以使用它的...
2020-04-08 13:58:06
7288
原创 Spring Security技术栈学习笔记(四)RESTful API服务异常处理
当我们从浏览器访问不存在的Spring Boot的RESTful API的时候,往往会返回Spring Boot内置的404错误界面,但是作为前后端分离的应用,相同的API也许会在其他终端访问,比如手机APP等,那么也会是相同的处理方式吗?一、Spring Boot的默认处理方式分析从浏览器端访问启动Spring Boot项目,从浏览器访问一个不存在的API,如“/us...
2020-04-08 13:57:35
4390
原创 Spring Security技术栈学习笔记(五)使用Filter、Interceptor和AOP拦截REST服务
一般情况,在访问RESTful风格的API之前,可以对访问行为进行拦截,并做一些逻辑处理,本文主要介绍三种拦截方式,分别是:过滤器Filter、拦截器Interceptor以及面向切面的拦截方式AOP。一、使用过滤器Filter进行拦截使用过滤器进行拦截主要有两种方式,第一种是将自定义的拦截器标注为Spring的Bean,在Spring Boot应用就可以对RESTful风格的...
2020-04-08 13:57:06
7711
5
原创 Spring Security技术栈学习笔记(六)使用REST方式处理文件服务
Spring Boot实现文件的上传和下载十分便捷,之前已经写了一篇关于Spring Boot实现文件上传的博客,用的是浏览上传的,而本篇博客使用的是代码模拟上传,两种方式不一样,可以参考一下。一、文件上传通过RESTful API上传文件,代码如下:package com.lemon.security.web.controller;import cn.hutool...
2020-04-08 13:56:43
4340
原创 Spring Security技术栈学习笔记(七)使用Swagger自动生成API文档
由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。本文将介绍RESTful API的重磅好伙伴Swagger2,它可以轻松的整合到Spring Boot...
2020-04-08 13:53:18
5162
原创 Spring Security技术栈学习笔记(八)Spring Security的基本运行原理与个性化登录实现
正如你可能知道的两个应用程序的两个主要区域是“认证”和“授权”(或者访问控制)。这两个主要区域是Spring Security的两个目标。“认证”,是建立一个他声明的主题的过程(一个“主体”一般是指用户,设备或一些可以在你的应用程序中执行动作的其他系统)。“授权”指确定一个主体是否允许在你的应用程序执行一个动作的过程。为了抵达需要授权的店,主体的身份已经有认证过程建立。一、Spri...
2020-04-08 13:52:53
10354
原创 Spring Security技术栈学习笔记(九)开发图形验证码接口
在设计登录模块的时候,图形验证码基本上都是标配,本篇博客重点介绍开发可重用的图形验证码接口,该接口支持用户自定义配置,比如验证码的长度、验证码图形的宽度和高度等信息。本文的目标是开发一个图形验证码接口,该验证码支持用户自定义长度,以及生成图片后图片的宽度和高度、验证码的过期时间等。接下来按照整个设计思路介绍开发流程。一、开发图形验证码实体类及属性类1)图形验证码实体类...
2020-04-08 13:52:09
5174
原创 Spring Security技术栈学习笔记(十)开发记住我功能
“记住我”几乎在登陆的时候都会被用户勾选,因为它方便地帮助用户减少了输入用户名和密码的次数,本文将从三个方面介绍“记住我”功能,首先介绍“记住我”功能基本原理,然后对“记住我”功能进行实现,最后简单解析Spring Security的“记住我”功能的源码。一、Spring Security的记住我功能基本原理Spring Security的“记住我”功能的基本原理流程图如下所示...
2020-04-08 13:51:28
4880
4
原创 Spring Security技术栈学习笔记(十二)将短信验证码验证方式集成到Spring Security
短信登录作为一种常见的登录认证方式,在Spring Security中是没有的,本篇博客将继续在之前文章的基础上,建立一套短信登录验证机制,并将其集成到Spring Security中。一、短信登录验证机制原理分析在Spring Security中,我们最常用的登录验证机制是基于用户名和密码的,输入了用户名和密码以及图片验证码之后,就会进入一系列的过滤器链中,直到验证成功或者验证失败为止。...
2020-04-08 13:50:26
4902
原创 Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍
开发第三方登录,我们必须首先要了解OAuth协议,本文首先简单介绍OAuth协议,然后基于Spring Social来开发QQ登录验证。一、OAuth协议简介OAuth协议诞生背景举一个场景例子,有一个第三方服务提供方,可以给图片提供美化的服务,而你的图片存储在百度云盘上,那么如何做到使第三方服务提供者对你的图片进行美化呢?传统的做法是将自己的百度云盘账户和密码授权给第三方服务提供者,他...
2020-04-08 13:49:57
5467
原创 Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式
上一篇文章《Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍》主要是介绍了OAuth2协议的基本内容以及Spring Social集成第三方登录验证的基本流程。那么在前篇文章的基础上,我们在本篇文章中将介绍Spring Social集成QQ登录的一个完整的开发流程。...
2020-04-08 13:48:37
7963
原创 Spring Security技术栈学习笔记(十五)解决Spring Social集成QQ登录后的注册问题
上一篇文章主要完成了Spring Social集成QQ登录主要逻辑,但是最后还是遗留了一个问题,那就是授权登录后跳转到了/signup上,其实这是Spring Social注册逻辑,所以我们就一起用这节内容来共同探讨解决这个问题。一、分析为什么会跳转到/signup上为什么会跳转到/signup上,或者在上面情况下会跳转到/signup上呢?我们一起阅读源代码来查找原因。我们在此把社交登录...
2020-04-08 13:47:51
7542
原创 Spring Security技术栈学习笔记(十六)使用Spring Social集成微信登录验证方式
类似于QQ登录,微信登录也是许多网站采用的一种登录方式之一,本文将从代码中讲解微信的OAuth协议与标准的OAuth协议区别,将微信登录集成到Spring Social中。...
2020-04-08 13:47:18
4750
3
原创 Spring Security技术栈学习笔记(十一)开发短信验证码登录
短信登录也是一种常见的登录方式,但是短信登录的方式并没有集成到Spring Security中,所以往往还需要我们自己开发短信登录逻辑,将其集成到Spring Security中,使用Spring Security来进行校验。本文将介绍开发短信登录的方法,并将其加入到Spring Security的验证逻辑中。一、短信登录逻辑设计以及图片验证码代码重构在前面一篇博客《Sprin...
2020-04-08 13:41:37
5539
15
原创 Spring Security技术栈学习笔记(一)环境搭建
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减...
2020-04-08 13:40:09
10154
7
原创 Spring Security技术栈学习笔记(二)RESTful API详解
RESTful一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。本篇博客主要讲述使用Spring MVC开发RESTful风格的API。一、传统API和RESTful API传统的API和RESTful API如下表所示: 行为 传统A...
2020-04-08 13:39:39
7835
原创 走进高并发(二)Java并行程序基础
一、进程和线程在操作系统这门课程中,对进程的定义是这样的:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进行是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。上面的定义很完整,对进程进行了全方面的定义,但是貌似进程是看不见摸不着的一个东西,实际上,我们可以通过查看计算...
2019-11-22 10:48:07
14150
7
原创 走进高并发(一)必备基础概念汇总
学习任何一门语言都是先要掌握其基本的学术概念,在掌握概念的基础上,再去深究其内部实现原理。学习并发编程,那么也需要先掌握其基本概念,然后去学习它的实现原理,最后将其应用到合适的场景中。一、必备基础概念1.同步(Synchronous)和异步(Asynchronous)同步:同步方法一旦调用,那么调用该同步方法的线程必须等待这个同步方法执行完毕之后才可以继续执行后续的代码,后续的代码可以实...
2019-11-19 07:23:47
4901
原创 LeetCode1 两数之和
题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解答pac...
2019-11-13 17:59:42
6997
原创 Spring Security入门到实践(二)表单认证实践及原理分析
本系列文章第一篇《Spring Security入门到实践(一)小试牛刀》从最简单的Spring Security入门案例开始展开,分析了HTTP Basic在Spring Security中的应用原理以及部分源码。本篇文章将从最常用的认证方式——表单认证开始,着重分析Spring Security的表单认证的基本原理。一、表单登录的默认行为分析登录认证功能是我们在日常生活中使用到最多的功...
2019-10-24 12:45:40
4606
原创 Spring Security入门到实践(一)HTTP Basic在Spring Security中的应用原理浅析
一、Spring Security简介打开Spring Security的官网,从其首页的预览上就可以看见如下文字:Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing...
2019-09-17 13:05:27
8940
7
恒华一点通(2013版)
2015-08-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人