自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发编程之死锁详解

前言:作为开发人员对死锁肯定不陌生,即使在项目中没有遇到过,但是至少也听过。死锁的出现存在着偶然性,但并不意味着程序没有存在死锁的风险(如果使用并发编程)一旦项目中出现死锁是一件非常严重的事情,它直接回导致项目卡死直至崩溃重启。今天给大家重点分享是,死锁是如何产生、如何检测死锁、以及如何避免死锁,最后会通过实例避免死锁。死锁的定义 死锁产生的原因 检测死锁 避免死锁一、死锁定义...

2019-02-21 15:55:03 1352

原创 并发编程之手写一个简单的线程池

前言:有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。所以他们在使用多线程的时候,往往都是通过直接new Thread来实现多线程。但是往往良好多线程的设计大多都是使用线程池去实现,今天主要是跟大家分享如何自己实现一个简单的线程池,帮助理解线程池的工作的原理,以及手动实现的这个线程池存在哪些缺点不足,最后分析JDK源码中的线程池是如何设计来解决这些缺点和不足。一,为什么要使用线程...

2019-02-20 18:26:32 10067 2

原创 从源码的角度分析mybatis的核心流程(上)

前言:mybatis可以说是目前互联网公司使用最广泛半自动的ORM框架,它不仅能够替代我们编写繁琐的JDBC代码,而且手动编写sql可以编写出更高性能的sql语句。这么优秀的开源框架,我觉得我们应该学习一下。mybatis的源码其实相对来说还是算比较简单,他是按功能划分模块,所以会使阅读者非常清晰容易理解。比如,cache、binding、logging、reflection、dataso...

2019-01-23 11:42:08 607 2

原创 从零开始搭建zookeeper集群(超详细)

zookeeper的集群环境搭建其实非常简单,我也是对zookeeper完全不了解的情况下搭建集群,下面详细的整理一下我搭建的过程,大家跟着下面的步骤一步一步来,基本上是能实现的。主要包括如下的几个大的步骤虚拟机安装 虚拟机的网络配置 jdk安装 zookeeper安装 配置文件的设置下面详细的介绍上面的具体步骤一、linux虚拟机的安装这个可参考下面这个博客:http:...

2019-01-07 19:25:47 4541

原创 单例设计模式的几种写法(java版本、超详细)

简介单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。这篇博客很精彩哦,请一定要耐心看完哦在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。如Android中常见的Application对象。基本思路单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得...

2018-11-07 21:58:09 409

原创 jenkins+maven+svn自动部署和发布(超详细,图文并茂)

博主前几个月刚被忽悠到一家创业公司(主要是看上这个行业的前景),博主进来主要的工作是java web后台开发和android应用开发。就这样在这家公司熟悉了一个星期的业务之后,开始维护和开发项目了。有一天令我惊讶的事情发生了——我修改代码之后提交到svn,准备发布项目了,我就问我们老大发布的网址是什么?他的回答让我很惊讶,他说没网址(当时不知道他是不是没听懂我的意思),我就问你们平时怎么发布web...

2018-10-28 01:58:12 44601 25

原创 SEATA配合nacos使用

本文主要选择nacos作为注册中心使用,下面记录一下操作的步骤。主要是网上有一些坑,并且网上有些文章不合理1.下载seata我下载的seata的版本是1.4.2下载地址:https://github.com/seata/seata/releases下载完成之后解压就行(我下载的是压缩包)2.seata配置(1).配置config/registry.confregistry.config文件主要是seata注册中心地址的配置,里面包括了各种注册中心的配置样例,我们这里选择了nacos为注册中心,

2021-09-06 20:51:26 5646 9

原创 mysql中锁的理解与LBCC详解

一.mysql中锁的介绍本文默认是基于mysql的innoDB存储引擎描述,并且版本是mysql5.7 不同的版本可能存在一些差异1. 按照模式划分共享锁(S Lock):可以分为共享锁和意向共享锁(IS)排它锁(X Lock):分为排它锁和意向排它锁(IX)共享锁和排他锁与我们平时所了解读写锁是非常类似的锁的兼容性如下表:ISIXSXIS兼容兼容兼容不兼容IX兼容兼容不兼容不兼容S兼容不兼容兼容不兼容X不兼容不兼容不兼

2021-09-05 23:30:35 877

原创 深入理解mysql中的MVCC

一. 概念先简单介绍一些概念,如果你已经知道了可以快速跳过该部分内容MVCC:Multi-Version Concurency Control,即多版本并发控制,它能够更好的帮助数据组提升并发读写能力隔离级别:mysql提供四种隔离级别,分别是READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE,默认的是REPEATABLE READmysql不同的隔离级别可能遇到不一样的问题,如,脏读,不可重复读,缓读,脏读:如果一个事务读到了

2021-09-04 19:03:31 339

原创 深入理解mysql中的MVCC

深入理解mysql中的MVCC一. 概念先简单介绍一些概念,如果你已经知道了可以快速跳过该部分内容MVCC:Multi-Version Concurency Control,即多版本并发控制,它能够更好的帮助数据组提升并发读写能力隔离级别:mysql提供四种隔离级别,分别是READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE,默认的是REPEATABLE READmysql不同的隔离级别可能遇到不一样的问题,如,脏读

2021-09-04 18:54:29 319

原创 netty详解与源码分析

Netty源码分析一.reator模型netty是reator模型的实现,我们先来看下reator模型单线程reator我用一个现实生活的例子来解释上面的图,我相信你一定能看懂假如你新开了一家火锅店,由于前期资金比较短缺,你没有足够的资金去请店员,只有你和你老婆两个人(夫妻店),你为了让你老婆轻松一点,你让你老婆啥事不用做,只负责听顾客的需求,然后转发给你做(其实你老婆在这里就是充当selector)。简化一下你需要做哪些事情1.接待顾客2.为顾客提供服务3.其他的工作,比如打扫卫生啥的

2021-03-04 19:25:00 726 2

原创 一问彻底理解dubbo主流程

由于我觉得服务端相对简单一点,所以先分析服务端接受请求流程的代码,再分析客户端调用的代码。本文重点解析的是调用以及调用需要初始化的处理器handler等,对于与注册中心的交互解析相对比较少。一.服务端初始化handler这里主要介绍主要的流程,并且默认dubbo协议1.handler整理流程要理清楚服务端调用流程最重要的就是要理清楚服务端的所有处理请求的handler,我们先来看看它的handler是如何初始化,并且逐级传递的我先上一个handler的初始化的流程,然后再上一个handler调用的

2021-03-04 19:09:40 239 2

原创 深入分析ReentrantReadWriteLock读写锁

今天一起来聊聊ReentrantReadWriteLock,当我们有遇到一写多读的场景时,我们可以用它来提升并发性能。因为它最大的特点就是读读并发,也就是读锁不会阻塞另外的线程获取读锁。如果对ReentrantLock不了解可以先参考这篇文章(深入理解ReentrantLock和AQS),因为写锁的获取和释放就是排他锁,所以流程和ReentrantLock获取锁和释放锁的流程基本一致,本文不会再过多的篇章去分析。一、特性在阅读ReentrantReadWriteLock源码之前,我们先了解它的特性是非常

2020-12-11 20:38:07 260

原创 spring源码分析之事务transaction下篇

上一篇文章已经详细分析了spring中如何创建事务(spring源码分析之事务transaction上篇),今天这篇文章主要是介绍spring中事务的回滚、事务提交、以及使用事务时的注意事项。这篇文章与上一篇文章有强关联,建议先去看上篇一、事务回滚我们只分析常用的传播属性REQUIRED(默认)、REQUIRES_NEW、NESTED,其他的可以自行阅读,也比较简单。我们还是拿上篇文章的例子来分析事务回滚和事务提交@Transactional(propagation = Propagation.REQ

2020-07-31 19:55:15 424

原创 spring源码分析之事务transaction上篇

大家基本上都用过事务,今天一起分析下spring源码中也比较重要的一个模块-事务。spring中事务这一块要完全使用好还是有一定难度,主要是很多细节需要注意,如果你还没有完全明白spring的事务,那么这篇文章肯定会让你收获满满。一、创建代理spring事务创建代理的流程和spring aop创建代理几乎是一模一样,不清楚的可以自行阅读相关资料或者参考这篇文章(spring aop分析)。这里稍微介绍创建代理之前spring会先创建几个重要的对象我们从@EnableTransactionManagem

2020-07-31 16:46:25 309

原创 spring源码解析之ConfigurationClassPostProcessor分析

ConfigurationClassPostProcessor是spring框架中非常重要的一个PostProcessor,尤其是现在的项目基本上都是使用springboot和springcloud,那么更加离不开它。我们先来看看它实现了哪些功能1.@Bean2.@Import3.@ComponentScan/@ComponentScans4.@ImportResource5.@PropertySource你没有看错,上述的功能都是基于这个PostProcessor来实现的,如果你还不了解,那么

2020-07-29 21:10:59 549

原创 spring源码分析-spring与tomcat整合原理

spring与tomcat整合的整理的流程图如下:流程图解析:1.SPI机制:tomcat启动时会通过SPI的机制加载所有包下面的META-INF/services/javax.servlet.ServletContainerInitializer,读取里面的内容(里面是一个实现了ServletContainerInitializer的类全路径)。此时tomcat就会实例化该全路径的类,然后调用onStartup()这就是spring和tomcat整合的入口,这种spi机制使用的非常广泛,比如spri

2020-07-27 11:41:12 833

原创 spring源码分析:bean的初始化

我们通过spring容器帮我们实例化并且维护bean的时候,有时候我们需要在bean在实例化完成的时候,帮我们做一些事情,这个时候我们就会使用到bean的初始化方法。举个例子,比如我们创建一个电脑,那么我们肯定就需要先安装系统,不然不能使用,此时我们就能把安装系统的过程封装到初始化方法中。我们今天主要来看我们常见的三种初始化的方法,并且分析一下他们的源码。我们这里分析的三个初始化方法如下,如果已经比较了解如何使用以及原理,可以跳过该文章1.实现InitializingBean接口2.使用@PostCo

2020-07-24 14:09:26 283

原创 spring源码分析之如何解决循环依赖

spring-ioc中循环依赖的问题,也算是高频的面试问题了,今天跟大家一起来总结一下spring-ioc中是如何解决循环依赖的,相信大家是可以从这篇文章中彻底理解spring容器如何帮我们解决循环依赖,为了更好的理解spring-ioc如何解决循环依赖,大家可以先简单的了解spring-ioc中bean实例化的整个时序图。一、spring-ioc解决循环依赖的位置红色的标注框的地方,表示解决循环依赖的重点逻辑,后面会跟大家一起详细阅读,这里大家可以先有个印象二、spring-ioc解决循环依赖的动

2020-07-02 20:57:37 794

原创 自己制作一个java:11的docker镜像

1、资源准备下载java11的jdk下载地址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html选择linux-64的版本(jdk-11.0.7_linux-x64_bin.tar.gz)2、创建Dockerfile文件文件内容如下:#1.指定基础镜像,并且必须是第一条指令FROM centos:7#2.指明该镜像的作者和其电子邮件MAINTAINER taolong.hong "taolong.hon

2020-06-17 19:40:08 5170

原创 安装kafka eagle监控kafka集群

安装kafka eagle监控kafka集群1、下载kafka eagle的压缩包并解压wget https://github.com/smartloli/kafka-eagle-bin/archive/v1.2.7.tar.gz解压tar -zxvf xxx2、配置环境变量需要配置JAVA_HOME和KE_HOME的环境变量在自己的home目录下面的.bash_profile文件里面增加如下内容export JAVA_HOME=/usr/local/jdk1.8.0_151#add ka

2020-06-03 17:44:31 477

原创 docker-compose搭建redis伪集群

docker-compose搭建redis伪集群1、端口的安排搭建三主三从,所以需要6个端口server_ip=192.168.43.23(自己的主机的ip地址)master-1:16379master-2:16380master-3:16381slave-1:16389slave-2:16390slave-3:16391这里虽然用到了6个端口,其实还需要占用3个集群总线的端口,就是master的端口+1000,也就是26379,26380,26381端口,需要查看端口是否被占用以及防火

2020-06-03 14:19:17 502

原创 docker搭建真机的kafka集群

使用docker搭建真机kafka集群1、搭建zookeeper首先搭建zookeeper、可以使用docker搭建zookeeper集群,如果是自己测试,可以在一台机器上使用docker搭建一个伪集群这里贴一份单机上搭建zookeeper伪集群的docker-compose文档docker-compose.yamlversion: '3.1'services: zoo1: image: zookeeper restart: always hostname: zoo

2020-06-03 10:57:07 480

原创 并发编程之线程中断interrupt

线程中断可能在平时的开发中我们用的不多,但是我相信大部分都见过InterruptedException,因为不管我们在调用object.wait()还是Thread.sleep()都会抛出一个InterruptedException。可能有很多人都是直接的继续抛出去或者不做任何处理直接打印堆栈信息,当然有可能这样没有问题,但是有些业务我们这样处理并不适合。要弄懂这些,我们就需要知道interrupt的作用是什么。一、如何让线程停止如果我们需要让一个线程停止,我们可以用什么方法呢?我们今天先不讨论那种过

2020-05-19 11:44:39 774

原创 解决docker容器部署dubbo服务时,注册到注册中心的地址是docker容器内的地址

今天遇到一个问题,我们用docker容器部署springboot的应用程序,当我们跨机器调用服务时,会出现无法调用到服务。经过排查出现问题的原因如下:1、Aservice使用docker部署,注册到zk上的ip地址为172.17.0.5(这是容器内部的ip地址)2、Bservice从zk取到Aservice的地址为Aservice容器内的地址3、当Aservice和Bservice不在同一个主机时,就出现无法互通要解决上述的问题,主要就是将docker容器管理的应用注册到zk上的地址弄成宿主机的ip

2020-05-19 10:56:07 5566

原创 并发编程之深入理解Condition

在并发编程中的开发中,我们难免会使用到等待通知模式,比如我们生产者消费者模式中,当生产者生产的东西填满了容器,则需要停止生产,当消费者把容器内的东西消费完了,也需要停止消费,同样的当容器内有新的东西生产出来,会通知消费者继续生产。可能我们平时使用synchronized比较多,一般我们使用使用object.wait()和object.notify()、notifyAll()。然而今天我们一起学习的是当我们使用jdk提供的并发编程的Lock实现等待通知模式,此时我们就需要使用Condition来实现—条件等待

2020-05-08 21:20:38 378

原创 并发编程之深入理解ReentrantLock和AQS原理

AQS(AbstractQueuedSynchronizer)在并发编程中占有很重要的地位,可能很多人在平时的开发中并没有看到过它的身影,但是当我们有看过concurrent包一些JDK并发编程的源码的时候,就会发现很多地方都使用了AQS,今天我们一起来学习一下AQS的原理,本文会用通俗易懂的语言描述AQS的原理。当然如果你了解CAS操作、队列、那么我相信你学习起来会感到无比轻松。我们会从锁(ReentrantLock)的入口来学习AQS,当然AQS不仅仅只是实现了锁,在很多的工具类中(如CountDow

2020-05-08 19:30:32 411

原创 java SPI机制的使用及原理

本片文章是针对dubbo SPI机制深入分析的平滑过渡的作用。当然咱们主要是学习优秀的思想,SPI就是一种解耦非常优秀的思想,我们可以思考在我们项目开发中是否可以使用、是否可以帮助我们解决某些问题、或者能够更加提升项目的框架等一、SPI是什么SPI(service provider interface)是java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。如...

2020-05-02 16:13:11 739

原创 springboot启动流程源码分析(二)

前言:前面和大家一起学习了springboot启动流程源码中如何从springboot过度到spring以及springboot如何内置tomcat,如何还不了解的童鞋可以去看一下之前的文章(springboot启动流程源码分析(1))。今天和大家一起学习的是springboot如何加载第三方的starter,只有熟悉了这个原理我们才会发现自定义springboot的starter也是非常容易。...

2020-03-25 16:57:26 197

原创 springboot启动流程源码分析(一)

前言:springboot相信基本上所有的人都使用过,但是对于一些初学者可能只是知道如何使用,但是对于它实现的原理不太熟悉,今天跟大家一起去分析下它的启动源码。其实也是比较简单,相信通过这篇文章能对一些初学者有一些帮助,在学习这篇文章之前最好有spring的基础知识。一、引入问题今天我们是以web应用为例来分析springboot的启动原理,首先我们看如下的代码@SpringBootAppl...

2020-03-15 21:35:47 485

原创 nginx中proxy_pass的使用(alias和root使用)

前面我们一起学习了location的匹配规则,如果还不了解的话可以参考我这边文章(nginx中location的使用),今天一起来学习nginx中proxy_pass的匹配过程,也是非常简单proxy_pass匹配主要分两种情况1、proxy_pass代理的url后面只有ip(域名)+端口,其他什么都没有(包括"/"都不能有)此时代理的路径需要把请求的url中ip+port后面的路径追加到p...

2020-01-11 14:14:59 6808

原创 nginx中location的使用

1、Location的语法规则语法规则:location [=||*|^~] /uri/ {…}下面详细解释上面出现的符号符号含义==开头表示精准匹配^~^~开头表示url以某个常规字符串开头,可理解为匹配url路径(禁止正则匹配)~~ 开头表示区分大小写的正则匹配,区分大小写~*~* 开头表示不区分大小写的正则匹配!和!*!和!*分别为...

2020-01-11 12:35:22 976

原创 Java8新特性—stream流的使用

前言:今天跟大家分享一下java8的新特性之一—流,肯定有很多人见到过,但是我相信目前很多人还没有广泛的使用流—可能暂时没有使用流的意识,或者说是使用的不熟练,如果真的是这样,那么今天分享的文章肯定会给你带来巨大的冲击,我们现在就来感受一下流的魅力。在学习流的相关操作之前,希望先熟悉下lambda表达式和optional,这样比较容易理解。一、热身运动流可以帮助我们写出更优雅且高性...

2019-09-15 00:10:52 305

原创 并发编程之深入理解threadlocal

前言:相信有一些开发经验的童鞋应该都听过threadlocal,但是可能有一些只是知道threadlocal的使用,并没有真正理解threadlocal的工作的原理,以及在使用threadlocal中可能会遇到的问题,今天会从源码的角度跟大家一起学习threadlocal使用的场景、常见的源码中如何使用它,以及使用threadlocal应该注意什么—内存泄露。1、Threadlocal的使...

2019-09-01 11:33:29 246

转载 VMware安装Centos7超详细过程(图文并茂)

原文:https://www.jianshu.com/p/ce08cdbc4ddb?utm_source=tuicool...

2019-08-24 18:56:08 434

原创 Java8新特性学习之二:lambda表达式深入学习

前言:前面我们已经学习过lambda的入门,也感性的了解了lambda可以帮助我们解决什么问题,今天跟大家一起深入的学习如何使用、以及在哪里使用lambda表达式。如果你希望在看源码中遇到了lambda表达式不会抓狂;你希望你的代码更加优雅、简洁、或者装逼专用,咱们一起来学习。Lambda表达式的语法 在哪里使用、如何使用lambda Lambda扩展一、lambda表达式语法...

2019-08-17 11:16:36 326

原创 Java8新特性学习之一:lambda表达式入门

前言:最近在系统性学习一些java8的新特性,说一下为什么打算系统的学习它呢。有下面几个原因:1、源码中经常有看到lambda表达式、Stream、Optional、LocalDate、LocalTime;2、从某书上看到java推荐函数式编程、并且新特性的内容性能提升了很多;3、装逼。如果你也对它感兴趣,那么从现在开始,咱们一起来学习吧,今天先将一下lambda表达式的入门、以及使用lamb...

2019-08-17 10:56:14 209

原创 从源码的角度深入理解spring AOP原理及流程

前言:Spring作为java开发必用的开源框架之一,必然有它非常优秀的且不可替代的地方,其中springIOC和Aop就是设计的非常优秀的地方,今天一起来学习一下spring是如何实现AOPAOP实现的思想:简单来讲就是使用了动态代理,对业务方法进行拦截增强(cglib或者jdk)继续深入的思考一下如下问题:如何创建动态代理 如何判断哪些类需要被代理增强,那些类不需要被增强 ...

2019-07-26 21:49:10 293

原创 如何解决克隆虚拟出现的Device eth0 does not seem to be present,delaying initialization错误

前言:为了学习分布式和集群创造更好的条件,模拟比较真实的环境,就打算用家里的老电脑装上三个虚拟机,同时自己的新电脑也装上三个虚拟机,这样就可以形成三主三从的高可用的环境了,但是在装好一台虚拟机并且配置好网络之后,克隆出来的虚拟机虽然把ip地址更改了但是重新启动网络服务的时候出现如下错误:Device eth0 does not seem to be present,delaying initi...

2019-06-16 17:28:32 551

原创 jenkins+git+maven自动部署和发布

前言:关于jenkins自动部署在前面也写过两篇博客,两篇的内容大概涵盖了jenkins的全局配置,项目配置、使用svn作为源码管理、构建war普通war包到tomcat以及构建和部署springboot项目,今天这边博客主要就是使用git作为源码管理、另外对前面两篇博客做查漏补缺的工作,相信通过这三篇博客没有基础的童鞋同样可以搭建起来各种项目。前面两篇博客的地址如下:jenkins+ma...

2019-05-15 15:09:13 849

空空如也

空空如也

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

TA关注的人

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