自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ORACLE数据导出工具

shell脚本实现oracle数据库导出csv和text文本文件。其原理是使用sqlplus客户端的mackup和spool

2024-01-24 21:17:50 613

原创 Spring之ShutDown Hook 死锁现象

Spring之ShutDown Hook 死锁现象分析

2022-07-23 16:09:28 4337 1

原创 分布式事务框架(seata1.5.0)源码分析-AT模式

深入seata1.5.0源码分析AT模式实现原理,解析其数据源代理过程

2022-07-23 13:33:45 2687

原创 分布式事务框架(seata1.5.0)源码分析-通信模型

深入源码解析seata的通信过程

2022-07-10 22:44:12 1131

原创 分布式事务框架(seata1.5.0)源码分析-TCC模式

深入seata源码了解分布式事务执行流程

2022-07-09 12:20:23 1416

原创 Spring5.0源码深度解析(注解驱动)-整体流程分析

现在基本所有的java应用都是面向Spring编程,那么Spring是如何加载Bean的?又是怎么解析@Configuration、@OnConditionalXXX、@Service、@Component、@Autowired、@Resource、@import等注解的?SpringAop的流程? 本文主要从源码的角度深入剖析这些问题。测试代码public class MyApplication { public static void main(String[] args) { Anno

2021-03-04 00:06:33 6279 3

原创 JAVA线程池源码深度解析

今天我们来说一说java编程中一个非常重要的工具:java线程池,顾名思义,线程池就是存放线程的池子。要使用线程的时候从池子里面拿出来,不用了再放回去。接下来我们将从源码的角度一步步分析java线程池的奥义。JAVA线程池先来看一下java线程池(ThreadPoolExecutor)大致的一个类图可以看到ThreadPoolExecutor的父接口有Executor和ExecutorService,其中ExecutorService是对Executor接口的扩展,AbstractExecu

2020-07-11 12:16:46 3432 1

原创 Java并发之BlockingQueue源码解析

首先来说BlockingQueue是什么?从字面上来看,BlockingQueue就是阻塞队列,它是一个先进先出且线程安全的队列。那么它什么时候发生阻塞?有两种情况:队列已满时进行入队操作,这个时候会阻塞,等待队列中的元素出队 队列为空时进行出队操作,这个时候也会阻塞,等待有元素入队BlockingQueue适用于生产者-消费者的场景。生产者不断地生产对象丢到BlockingQueue中(入队),直到BlockingQueue爆满。生产者线程会阻塞,等待消费者消费对象。而消费者不断地从Blockin

2020-07-04 15:21:55 260

原创 AQS之ReentrantReadWriteLock

本文对java并发包中ReentrantReadWriteLock进行源码分析,我们都知道ReentrantReadWriteLock就是读写锁,也是基于AQS来实现的,但是它拥有两种锁实例,读锁和写锁。其中写锁是独占锁,该锁同一时间被一个线程持有。而读锁是共享锁,可以被多个线程同时使用。ReentrantReadWriteLock在持有写锁的情况下,是可以获取读锁的。而持有读锁的情况下,是不允许获取写锁的,必须先释放掉读锁再获取写锁,否则会出现死锁情况。下面进入源码分析环节,先来看一看Reentr

2020-06-28 20:03:04 235

原创 AQS之Semaphore

目录acquirerelease总结从字面意思上来看,Semaphore 就是信号量的意思,可以用来做并发控制。其实我们可以把它理解成一个资源池,类似java的线程池。Semaphore是基于AQS的共享模式来实现的,所有线程共用同一个资源池。在构造方法中可以初始化资源的数量,例如new Semaphore(N),这里传入的N,其实就是将AQS中的state初始化为N,每个线程来了之后,通过acquire()方法获取到资源后,才能继续往下执行,获取资源其实就是对state进行-1 ,如果

2020-06-19 20:14:27 252

原创 AQS之CyclicBarrier

目录await总结上篇文章介绍了CountDownLatch,这篇文章重点介绍CyclicBarrier。上篇文章里说过,CountDownLatch是基于AQS的共享模式实现的,而CyclicBarrier其实是基于ReentrantLock和Condition来实现的。从名称上来看CyclicBarrier就是可循环的栅栏,如果我们把CountDownLatch当成一个计数器,那CyclicBarrier就是可重复利用的计数器,它拥有重置的功能,而CountDownLatch减到0就没了。

2020-06-19 00:16:19 230

原创 AQS之CountDownLatch

CountDownLatch是java并发包中一个常见的类,本文将从源码的角度来分析CountDownLatch的实现原理,而CountDownLatch是基于AQS的共享锁模式来实现的,所以需要对AQS有一定的了解。

2020-06-10 21:09:14 331

原创 AQS之Condition

本文重点介绍Condition的实现原理,Condition是基于ReentrantLok来实现的,要使用Condition必须先持有锁,所以Condition和ReentrantLock是配对使用的。Condition主要有两个方法await等待和signal唤醒,适用于生产者-消费者使用场景。下面是一个Condition的使用示例:Condition是通过ReentrantLock new出来的。老规矩,先来看下Condition的构造方法 public Condition n.

2020-06-05 21:19:13 414

原创 AQS之ReentrantLock

AQS是AbstractQueuedSynchronizer的简称,它是java并发包很重要的一个工具类,像比较常见的ReentrantLock、CountDownLatch等都是在AQS的基础上建立的。本文将从ReentrantLock的源码开始分析AbstractQueuedSynchronizer和ReentrantLock的工作原理。AbstractQueuedSynchronizer我们先来看下AbstractQueuedSynchronizer这个类里面都有些啥东西public a

2020-05-26 22:05:21 313

原创 HashMap和concurrentHashMap解析

HashMap1.7HashMap是非线程安全的,不支持并发操作,其实现比较简单。先来看下JDK1.7中HashMap的结构图HashMap里面是一个数组,数组中的每个元素是一个Entry对象,每个Entry对象的next属性指向下一个Entry。构成一个单向链表。Entry类如下:static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value;

2020-05-16 11:05:32 207

原创 JVM垃圾回收与调优

首先,第一个问题:什么是垃圾?我们说当一个对象,没有任何引用指向它的时候,那这个对象就是垃圾。那么JVM是怎么知道这个对象已经没有引用指向它了呢?也就是说JVM是怎么找到垃圾的?目前来说有两种算法:reference count(引用计数)、Root Searching(根可达)reference count(引用计数)在对象的头信息中记了一个数,每当有一个引用指向了这个对象,...

2020-05-06 22:29:11 573

原创 volatile底层原理剖析

在理解volatile之前,我们先来熟悉下计算机执行程序的过程要执行我们的应用程序,首先将我们的程序从磁盘上读取到内存中,内存里这个时候存放了要执行的指令和数据,要执行一条指令的时候,指令寄存器根据程序计数器PC中存放的下一条待执行指令的地址,从内存中将指令取出来,cpu再根据指令内容将内存中的数据读取到数据寄存器中,ALU(算数逻辑单元)计算得出结果,将结果数据写回到内存。volat...

2020-04-25 00:28:27 359

原创 Synchronized笔记

CAScas(compare and swap)它指的是比较与交换,使用无锁的机制保证操作对象的原子性,说是无锁,其实它是一个自旋锁。首先读取当前值,在计算预期的结果值,在把值修改回去的时候,要比较一下原来读出来的值和现在的值是否相等,如果相等,说明没有别的线程改动过,更新为新的值。如果不一样则说明已经别的线程改过了,这个时候,再次读取当前值,重新再来一遍。cas的底层是由汇编指令lo...

2020-04-14 22:40:10 2776 6

原创 从spring容器启动解析webmvc源码

Spring webmvc启动流程本文将从spring容器启动过程去分析springmvc源码,首先我们思考一个问题:web容器在启动的时候是怎么将bean解析并加载到spring容器中的,像我们自己如果要启动容器,那是不是要new ApplicationContext(),并且把xml配置文件路径或者包扫描路径传进去。那么webmvc是怎么解决这个问题的呢?以tomcat为例,我们的...

2020-04-11 12:01:28 176

原创 kafka API实践(kafka原理验证)

kafka生产者APIkafka生产者发送消息采用异步发送的方式,我们在写发送消息的代码的时候,会调用send方法,整个发送的过程涉及两个线程:main线程和sender线程,有一个重要的线程共享变量:RecordAccumulator,main线程将消息放到RecordAccumulator中缓存,serder线程不断从 RecordAccumulator中poll消息发送到 kafka(p...

2020-04-09 22:27:24 224

原创 Spring IOC循环依赖源码解析

本文主要针对spring IOC解决循环依赖的整个流程,从源码的角度对springioc bean注册、实例化,循环依赖作一个详细的讲解。

2020-04-03 23:58:55 844

原创 shell脚本启动kafka集群

前提:kafka集群之间已配置ssh免密登录,kafka集群配置路径一致要实现kafka群起脚本思路:通过ssh登录后,循环启动每台机器的kafka和zookeeperkafka和zookeeper单机启动脚本:remote_server.sh#!/bin/bash#zookeeper 进程号ZK_PID=`ps -ef|grep zookeeper|grep -v grep...

2020-03-30 21:09:43 891 1

原创 linux SSH免密登录

现在有三台机器组成一个linux集群:192.168.72.127192.168.72.128192.168.72.129要实现相互之间通过ssh密码登录,方便执行自动化脚本第一步:通过ssh生成rsa公私密钥,分别在三台机器上执行如下指令,使用默认配置,一路回车,结果如下所示ssh-keygen -t rsa[root@rabbit-node2 ~]# ssh-key...

2020-03-29 00:11:32 405

原创 kafka架构和原理分析

本文对kafka架构做一个详细的剖析,重在分析其实现原理。

2020-03-22 11:07:46 1542 1

原创 rabbitmq高可用集群搭建踩坑

rabbitmq高可用集群搭建踩坑搭建rabbtmq集群时,执行 rabbitmqctl join_cluster rabbit@rabbit-node1报错Clustering node rabbit@slave1 with rabbit@rabbit-node1Error: unable to perform an operation on node ‘rabbit@rabbit-nod...

2019-06-29 01:16:22 8182 2

ORACLE数据导出脚本

通过sqlplus客户端spool导出数据

2024-01-24

空空如也

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

TA关注的人

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