- 博客(106)
- 收藏
- 关注
原创 ConcurrentHashMap核心源码浅析
1.引子并发编程中使用HashMap可能导致程序死循环。因为多线程会put方法添加键值对时将导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。另外Hashtable只是简单地使用阻塞式锁(synchronized关键字)来保证线程安全,在并发编程中使用HashTable效率较低。基于此,Concurre...
2020-02-27 23:35:25 301 1
原创 文本编辑器vim/vi用法完整说明
Vim用法1.启动vim2.命令模式和输入模式3.退出vim4.vi与ex命令vi是UNIX/Linux系统下最强大的文本编辑器(另一个是Emacs),其命令较多,完全基于键盘操作,习惯了使用图形化文本编辑器的同学学习起来比较费劲。而vim是vi的增强版本,两者用法大致相同,这里主要总结性地介绍Vim的核心用法。1.启动vimvim -C [-rR] [file…]选项’-C’,将以兼容...
2019-05-12 08:22:15 596
原创 centos上安装并持久化配置LVS
1)系统版本:centos7.82)虚拟机:3个centos虚拟机,(其中一个做Director Server,另外两个做Real Server)3) LVS大致有NAT ,DR ,Tun这三种模式,这里搭建一个典型的DR模式的LVS。
2023-12-02 01:17:03 599
原创 低权限(无权限)时如何在mysql客户端控制台的大量输出中快速定位mysql死锁或慢sql
(注意是mysql的客户端中使用kill,不是linux的shell终端中,linux的kill命令只能杀进程而无法杀线程,这里输出的这个390033是mysql的一个线程id,只能在mysql的客户端中起作用)这个命令的输出信息太多了,我们公司很多个库都部署在同一个mysql实例中,所以其他库的进程信息也输出到控制台了。查看mysql的查看死锁的方式很多,但很多时候我们普通开发者的权限比较低,无法执行某命令。此时将mysql的进程信息输出到mysql 你就可以使用grep命令过滤出你需要的死锁信息了。
2023-11-22 23:29:47 201
原创 netty的NioEventLoopGroup的创建过程
EventLoopGroup是一个事件循环组,它管理着多个EventLoop,每个EventLoop都可以看成一个线程池(一般是单个线程,netty的几乎所有EventLoop实现类都是但线程池).一个EventLoopGroup上会注册多个Channel,实际上它会根据内部EventExecutorChooser的算法,将一个Channel注册到其内部管理的一个具体的EventLoop,此EventLoop线程池处理这个Channel的所有IO事件和业务任务,而其他EventLoop线程池不能处理.
2022-05-31 23:44:48 422
原创 Spring容器refresh方法执行流程
spring启动过程onfresh主流程refresh{ // Prepare this context for refreshing. // Prepare this context for refreshing, setting its startup date and active flag as well as performing any initialization of property sources. // 设置其启动日期和活动标志以及各种任何属性来源的初始化。 初始化
2022-05-27 03:36:13 335
原创 Jackson配置大全
jackson支持以下格式Avro, BSON, CBOR, CSV, Smile, (Java) Properties, Protobuf, TOML, XML or YAML;1.基础注解注解用法@JsonProperty用于属性,把属性的名称序列化时转换为另外一个名称。示例:@JsonProperty("birth_date") private Date birthDate@JsonIgnore可用于字段、getter/setter、构造函数参数上,作用相同,都会对
2022-03-30 14:48:27 5625
原创 forkjoinpool源码分析
ForkJoinPool是用于执行ForkJoinTask任务的ExecutorService。 ForkJoinPool不仅提供了来自非ForkJoinTask任务提交的入口,另外还提供相关的管理和监控。ForkJoinPool与其他类型的ExecutorService的不同之处主要在于,它采用了工作窃取算法:池中的所有线程都会尝试查找并执行池中的任务或由其他活动任务所创建的任务(如果不存在,则需要阻塞等待) 。当大量任务产生其他子任务时(大多数ForkJoinTask就是如此)及外部提交者向池中提交大
2022-01-10 11:46:37 1346
翻译 在 Spring Boot 使用Bean Validation 完全指南
1 前言Bean Validation是 Java 生态圏中实现Bean校验规范的事实上的标准。 它与 Spring 和 Spring Boot 能很好地集成在一起。但是,也存在一些问题。 本教程详细介绍了所有主要的校验用例和每个用例的代码示例。代码示例他的文章附有 GitHub 上的工作代码示例。2 使用 Spring Boot Validation StarterSpring Boot 的 Bean Validation 支持起步依赖starter,我们可以将其包含到我们的项目中(在Gr
2021-11-20 20:05:15 2010
翻译 在Spring Bean 生命周期中加入钩子函数
1 前言提供一个控制反转功能是 Spring框架的核心功能之一。 Spring 在其应用程序上下文中组织并 并管理这些beans的生命周期。 在本教程中,我们将研究这些 bean 的生命周期以及我们如何加入这些钩子函数。代码示例他的文章附有 GitHub 上的工作代码示例。2 什么是 Spring Bean?让我们从基础开始。 在创建、编排和销毁方面受 Spring 的 ApplicationContext控制的每个对象都称为 Spring Bean。定义 Spring bean 最常见的方
2021-11-13 21:06:36 917
原创 使用@AutoConfigureBefore @AutoConfigureAfter注解指定bean实例化先后顺序为啥没效果?
@AutoConfigureBefore @AutoConfigureAfter 是针对自动配置类的,如果直接在一个在启动类的子包下的javabean上使用此注解是不生效的。这个注解应该放置在启动类无法扫描到的地方,另外还要在classpath目录下建一个文件META-INF/spring.factories,在这个文件中指定自动配置类的全路径。如何保证一个配置类不会被springboot项目启动后扫描到,在启动类的上层父包中建一个配置类吗?类似于上面附图这样的结构吗?这项目结构也太奇怪了,对于我这种
2021-08-17 22:22:15 1151 3
原创 公共dto打包时按条件导出实现feignclient接口的bean,解决feign.Feign$Builder类找不到的问题
不同的微服务之间相互调用,不可避免会使用到feign client。为了统一处理参数和请求地址等变化,我们一般会将这些API服务的请求参数dto、响应dto及Feign接口封装在一个公共的dto项目中(为了防止jar包冲突和依赖传递,这里的feign stater包的作用域是provided),调用方引入这个项目jar包,就可以直接使用这些相关api服务。有的项目本身可能不需要Feign接口,只需要请求参数dto、响应dto,因此他们在自己的项目中没有引入feign starter这个jar包,但在公共的d
2021-05-24 17:34:42 679
原创 spring security使用自定义的的AuthenticationFilter时,要限制session个数,禁止多端同时登录
在WebSecurityConfigurerAdapter#configure(HttpSecurity)方法中配置session管理没有效果,因为我们使用了自己的AuthenticationFilter,只能手动给LoginFilter配置SessionAuthenticationStrategy。@Configurationpublic class CustomFilterSecurityConfig extends WebSecurityConfigurerAdapter { //ses
2021-04-14 19:27:33 1194 6
原创 spring security 用JPA进行安全管理中使用自定义的UserDetails时,maximumSessions()无法限制Session数
这是我自定义的UserDetails,这个user对象会保存到数据库。//自定义的User@Entity(name = "t_user")public class User implements UserDetails, CredentialsContainer { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username;
2021-04-14 14:59:26 593
原创 spring security 使用自定义的AuthenticationFilter,提示Invalid remember-me cookie,自动登录失败的解决方法
spring security 在使用自定义的AuthenticationFilter时,提示Invalid remember-me cookie,自动登录失败的解决方法后台日志报错提示Invalid remember-me cookie: Cookie token[2] contained signature ‘1706b276eae214cc837865d3c508cf01’ but expected ‘84908c8a60e515d544d96550496f0daf’我自定义了一个Login
2021-04-14 02:31:01 793
原创 Spring Bean生命周期简图
流程图getBean大致调用栈 Aware Group1 BeanNameAware BeanClassLoaderAware BeanFactoryAware Aware Group2 EnvironmentAware EmbeddedValueResolverAware //该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可
2021-03-17 15:05:08 192 3
原创 原子更新引用AtomicReference实现原理分析
1 前言原子更新基本类型只能更新单个变量,而原子更新引用类型可以原子更新多个变量。Atomic包提供了以下3个类。AtomicReference:原子更新引用类型。AtomicReferenceFieldUpdater:原子更新引用类型里的字段。AtomicMarkableReference:原子更新带有标记位的引用类型(可以原子更新一个布尔类型的标记位和引用类型。)。现在先来看看AtomicReference是如何实现的(基于JDK1.8)2 实现过程分析主要字段private sta
2020-06-28 03:11:54 1375 5
原创 原子数组AtomicIntegerArray实现原理简析
1 前言JDK官方提供了3个原子数组,它们提供了原子更新数组中元素的能力,它们主要借助Unsafe类实现其核心功能。AtomicIntegerArray:原子更新整型数组里的元素AtomicLongArray:原子更新长整型数组里的元素。AtomicReferenceArray:原子更新引用类型数组里的元素。在分析原子数组之前,我们先来了解Java对象的内存布局,Java对象由对象头和实例数据两部分组成。下图中MarkWord包含对象的hashCode、锁信息、垃圾回收的分代信息
2020-06-21 02:17:45 873
原创 交换者Exchanger完全解析
1 前言Exchanger(交换者)是一个用于线程间协作的工具类, 它可以在配对线程中配对并交换数据。每个线程都可以在exchange入口方法上携带数据,然后与相应的线程进行匹配,并在返回时接收配对线程的数据。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行...
2020-06-01 01:58:00 879
原创 多线程数据交换工具Exchanger完全解析
1 前言Exchanger(交换者)是一个用于线程间协作的工具类, 它可以在配对线程中配对并交换数据。每个线程都可以在exchange入口方法上携带数据,然后与相应的线程进行匹配,并在返回时接收配对线程的数据。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。交换器可能在遗
2020-06-01 01:50:35 671
原创 信号量Semaphore深入解读
1 简介Semaphore可翻译为信号量,它维护一组许可证, 每次尝试获取许可证时都将阻塞等待直到可获取,它才能获取到并解除阻塞状态。 Semaphore可以控制一些物理或逻辑资源的访问或使用,它常常用于限制线程数目。在实际开发中,可用作流量控制,特别对于一些公共资源有限的应用场景,如数据库连接,或是一些其他限流的缓存池。(基于JDK1.8)2 示例这是一个使用信号量控制对缓存池缓存中items访问的示例。public class SemaphoreDemo { static class P
2020-05-25 01:26:47 386
原创 CyclicBarrier源码深入剖析
1 前言CyclicBarrier是一种同步工具,它允许一组线程在到达一个公共的屏障点时阻塞等待,直到最后一个线程到达屏障点,屏障才能开启,此时所有被阻塞线程才能被唤醒从而继续执行。CyclicBarrier是一个可循环利用(cyclic)的的屏障(barrier),与CountDownLatcher相比的不同之处在于,它可以重置屏障的次数,它可以在释放等待线程之后重新使用。(基于JDK1.8)2 用法示例CyclicBarrier默认的构造方法是CyclicBarrier(int parties),
2020-05-17 22:45:09 233
原创 倒数闩锁CountDownLatch源码浅析
1 前言CountDownLatch是一种同步辅助工具类,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。(源码分析基于JDK1.8)CountDownLatch需要用给定的闩锁计数count初始化。await方法使当前线程阻塞(每执行一次countDown方法就将闩锁计数减1),直到闩锁计数达到零时(所有因此阻塞等待的线程都)才会被唤醒。CountDownLatch是一次性使用的同步工具,闩锁计数无法重置,如果需要重置计数,可能使用CyclicBarrier更合适。2 用法示例
2020-05-11 23:18:34 164
原创 原子类AtomicInteger实现浅析
1 前言在多线程程序中,如果多个线程同时更新一个共享变量,可能会出现预料之外的奇怪的值。普通的变量无法在多线程下做到可见性、一致性、原子性,也就无法保证线程安全。在JDK的java.util.concurrent.atomic包中提供许多原子操作类,它们可以简单、 高效、安全地更新一个变量。现在介绍其中的基本类型的原子操作类。基本数据类型有boolean 、 char 、 byte 、 sho...
2020-05-06 21:26:39 278
原创 双端阻塞队列LinkedBlockingDeque源码深入解析
1 前言与普通队列相比,阻塞队列另外支持两个附加操作,这两个附加的操作支持阻塞的插入和移除方法。①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。一般的阻塞队列相比,只能在“尾部入队、在头部出队”,而双端阻塞队列,在头部和尾部均能入队,在头部和尾部均能出队。LinkedBlockingDeq...
2020-04-22 11:43:05 351
原创 阻塞队列LinkedBlockingQueue源码深入剖析
1 前言与普通队列相比,阻塞队列另外支持两个附加操作,这两个附加的操作支持阻塞的插入和移除方法。①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。LinkedBlockingQueue继承于抽象类AbstractQueue,并实现了BlockingQueue接口。它内部主要使用两个”条件“来实...
2020-04-20 12:22:56 215
原创 ArrayBlockingQueue核心源码解读
1 前言队列是一种在尾部添加元素、从头部删除元素的数据结构,而阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。①支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。②支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费...
2020-04-13 21:52:09 177
原创 定时任务执行器ScheduledThreadPoolExecutor源码完整解读
目录1 前言2 静态内部类DelayedWorkQueue3 成员内部类ScheduledFutureTask1) 成员变量2) 构造方法3) 方法(1) getDelay(TimeUnit)(2) compareTo(Delayed)(3) isPeriodic()(4) setNextRunTime()(4) cancel(boolean)(5) run()4 构造方法与字段5 主要方法1) ...
2020-04-05 19:36:03 662
原创 线程池执行器ThreadPoolExecutor源码完整解读
1 前言ThreadPoolExecutor的基本概念和用法已经在之前的文章线程池ThreadPoolExecutor简介 、Executor框架完整解读中做过详细的说明,这里主要基于JDK1.8对ThreadPoolExecutor从源码级别分析其实现原理。ThreadPoolExecutor是ExecutorService的最重要的实现类,ThreadPoolExecutor不直接实现Ex...
2020-03-30 23:45:25 374
原创 IDEA快捷键完整说明
目录1 编辑相关(Editing)2 查找引用点(Usage Search)3 导航相关(Navigation)4 搜索和替换(Search/Replace)5 实时模板代码(Live Templates)6 重构 (Refactoring)7 调试(Debug)8 编译与运行(Compile/Run )9 版本控制相关(VCS/Local History)10 其他我在网上看到了不少介绍ID...
2020-03-28 01:55:18 284
原创 Executor框架完整解读
目录1 前言2 Executor框架组成3 Runnable和Callable4 ThreadPoolExecutor1) 固定线程池2) 单线程池3) 缓存线程池5 ScheduledThreadPoolExecutor6 Future1 前言Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由...
2020-03-27 01:02:08 472
原创 线程池ThreadPoolExecutor简介
1 前言线程池是并发编程中一个重要的概念和技术。大多数异步或并发执行任务都会用到线程池。 线程池,正如其名,它是有一定数量的线程的池子,它会执行被提交过来的任务,执行完一个任务后不会马上结束,它们会继续等待或执行新的任务。线程池有两个重要的概念一个是任务队列,另一个是工作者线程 。任务队列是存放任务的容器,工作者线程会依次不断地到队列中获取任务并执行。线程池有这些优点:① 减少...
2020-03-24 23:35:00 191
原创 线程池执行器ThreadPoolExecutor概述
1 前言线程池是并发编程中一个重要的概念和技术。大多数异步或并发执行任务都会用到线程池。 线程池,正如其名,它是有一定数量的线程的池子,它会执行被提交过来的任务,执行完一个任务后不会马上结束,它们会继续等待或执行新的任务。线程池有两个重要的概念一个是任务队列,另一个是工作者线程 。任务队列是存放任务的容器,工作者线程会依次不断地到队列中获取任务并执行。线程池有这些优点:①减少系统...
2020-03-24 23:13:19 373
原创 AbstractExecutorService源码完全解析
AbstractExecutorService源码完全解析1 前言之前的文章[异步任务执行器简介]对ExecutorService有过简单的介绍,AbstractExecutorService是一个实现ExecutorService接口的非常重要的抽象类,它提供了ExecutorService接口的默认实现。一般情况下,我们可直接继承AbstractExecutorService来实现自己的任...
2020-03-22 15:38:00 530 1
原创 Fork/Join框架简介
1 引子Fork/Join框架是从Java1.7开始提供的一个并行处理任务的框架(本篇博客基于JDK1.8分析),它的基本思路是将一个大任务分解成若干个小任务,并行处理多个小任务,最后再汇总合并这些小任务的结果便可得到原来的大任务结果。从字面意思来理解Fork/Join框架,"Fork"表示“分叉”,它把大任务分解成多个小任务并行处理,而“Join”表示“联合”,它将这些小任务的结果...
2020-03-21 21:51:00 337
原创 Fork/Join框架基本说明
目录1 引子2 使用Fork/Join框架1) 步骤2) 用例3 Fork/Join框架的异常处理4 Fork/Join框架的实现原理1) ForkJoinTask的fork方法实现原理2) ForkJoinTask的join方法实现原理1 引子Fork/Join框架是从Java1.7开始提供的一个并行处理任务的框架(本篇博客基于JDK1.8分析),它的基本思路是将一个大任务分解成若干个小任务...
2020-03-21 20:40:18 404
原创 FutureTask源码完整解读
文章目录1 简介2 用法示例3 实现原理1) 成员变量2) 构造方法3) 主要API(1) run与runAndReset(2) get方法(3) cancel方法(4) 其他辅助方法1 简介上一篇博客“异步任务服务简介”对FutureTask做过简要介绍与分析,这里再次对FutureTask做一次深入的分析(基于JDK1.8)。FutureTask同时实现了Future 、Runnable...
2020-03-13 01:29:30 277
原创 异步任务执行器Executor简介
文章目录1.基本接口1)Executor接口2)Future接口2.用法示例3.基本原理1)ExecutorService实现2)Future实现以前线程Thread既表示执行的任务,又表示执行的机制。在JDK1.5中,java并发框架提供了一种“执行服务”的相关API,它将"任务的执行"和"任务的提交“相分离,”执行服务“封装了任务执行的细节,对于任务提交者来说,它可进一步聚焦于任务本身,如任...
2020-03-12 00:27:24 652
原创 并发编程中常用的阻塞队列概述
文章目录1.简介2.阻塞队列分类3.阻塞队列详述1)普通阻塞队列2)优先级阻塞队列3)延时阻塞队列4)其他阻塞队列1.简介阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。...
2020-03-08 16:42:56 236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人