- 博客(25)
- 收藏
- 关注
原创 ORACLE数据导出工具
shell脚本实现oracle数据库导出csv和text文本文件。其原理是使用sqlplus客户端的mackup和spool
2024-01-24 21:17:50
707
原创 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
6347
3
原创 JAVA线程池源码深度解析
今天我们来说一说java编程中一个非常重要的工具:java线程池,顾名思义,线程池就是存放线程的池子。要使用线程的时候从池子里面拿出来,不用了再放回去。接下来我们将从源码的角度一步步分析java线程池的奥义。JAVA线程池先来看一下java线程池(ThreadPoolExecutor)大致的一个类图可以看到ThreadPoolExecutor的父接口有Executor和ExecutorService,其中ExecutorService是对Executor接口的扩展,AbstractExecu
2020-07-11 12:16:46
3550
1
原创 Java并发之BlockingQueue源码解析
首先来说BlockingQueue是什么?从字面上来看,BlockingQueue就是阻塞队列,它是一个先进先出且线程安全的队列。那么它什么时候发生阻塞?有两种情况:队列已满时进行入队操作,这个时候会阻塞,等待队列中的元素出队 队列为空时进行出队操作,这个时候也会阻塞,等待有元素入队BlockingQueue适用于生产者-消费者的场景。生产者不断地生产对象丢到BlockingQueue中(入队),直到BlockingQueue爆满。生产者线程会阻塞,等待消费者消费对象。而消费者不断地从Blockin
2020-07-04 15:21:55
295
原创 AQS之ReentrantReadWriteLock
本文对java并发包中ReentrantReadWriteLock进行源码分析,我们都知道ReentrantReadWriteLock就是读写锁,也是基于AQS来实现的,但是它拥有两种锁实例,读锁和写锁。其中写锁是独占锁,该锁同一时间被一个线程持有。而读锁是共享锁,可以被多个线程同时使用。ReentrantReadWriteLock在持有写锁的情况下,是可以获取读锁的。而持有读锁的情况下,是不允许获取写锁的,必须先释放掉读锁再获取写锁,否则会出现死锁情况。下面进入源码分析环节,先来看一看Reentr
2020-06-28 20:03:04
335
原创 AQS之Semaphore
目录acquirerelease总结从字面意思上来看,Semaphore 就是信号量的意思,可以用来做并发控制。其实我们可以把它理解成一个资源池,类似java的线程池。Semaphore是基于AQS的共享模式来实现的,所有线程共用同一个资源池。在构造方法中可以初始化资源的数量,例如new Semaphore(N),这里传入的N,其实就是将AQS中的state初始化为N,每个线程来了之后,通过acquire()方法获取到资源后,才能继续往下执行,获取资源其实就是对state进行-1 ,如果
2020-06-19 20:14:27
270
原创 AQS之CyclicBarrier
目录await总结上篇文章介绍了CountDownLatch,这篇文章重点介绍CyclicBarrier。上篇文章里说过,CountDownLatch是基于AQS的共享模式实现的,而CyclicBarrier其实是基于ReentrantLock和Condition来实现的。从名称上来看CyclicBarrier就是可循环的栅栏,如果我们把CountDownLatch当成一个计数器,那CyclicBarrier就是可重复利用的计数器,它拥有重置的功能,而CountDownLatch减到0就没了。
2020-06-19 00:16:19
244
原创 AQS之CountDownLatch
CountDownLatch是java并发包中一个常见的类,本文将从源码的角度来分析CountDownLatch的实现原理,而CountDownLatch是基于AQS的共享锁模式来实现的,所以需要对AQS有一定的了解。
2020-06-10 21:09:14
463
原创 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
451
原创 AQS之ReentrantLock
AQS是AbstractQueuedSynchronizer的简称,它是java并发包很重要的一个工具类,像比较常见的ReentrantLock、CountDownLatch等都是在AQS的基础上建立的。本文将从ReentrantLock的源码开始分析AbstractQueuedSynchronizer和ReentrantLock的工作原理。AbstractQueuedSynchronizer我们先来看下AbstractQueuedSynchronizer这个类里面都有些啥东西public a
2020-05-26 22:05:21
465
原创 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
225
原创 JVM垃圾回收与调优
首先,第一个问题:什么是垃圾?我们说当一个对象,没有任何引用指向它的时候,那这个对象就是垃圾。那么JVM是怎么知道这个对象已经没有引用指向它了呢?也就是说JVM是怎么找到垃圾的?目前来说有两种算法:reference count(引用计数)、Root Searching(根可达)reference count(引用计数)在对象的头信息中记了一个数,每当有一个引用指向了这个对象,...
2020-05-06 22:29:11
586
原创 volatile底层原理剖析
在理解volatile之前,我们先来熟悉下计算机执行程序的过程要执行我们的应用程序,首先将我们的程序从磁盘上读取到内存中,内存里这个时候存放了要执行的指令和数据,要执行一条指令的时候,指令寄存器根据程序计数器PC中存放的下一条待执行指令的地址,从内存中将指令取出来,cpu再根据指令内容将内存中的数据读取到数据寄存器中,ALU(算数逻辑单元)计算得出结果,将结果数据写回到内存。volat...
2020-04-25 00:28:27
399
原创 Synchronized笔记
CAScas(compare and swap)它指的是比较与交换,使用无锁的机制保证操作对象的原子性,说是无锁,其实它是一个自旋锁。首先读取当前值,在计算预期的结果值,在把值修改回去的时候,要比较一下原来读出来的值和现在的值是否相等,如果相等,说明没有别的线程改动过,更新为新的值。如果不一样则说明已经别的线程改过了,这个时候,再次读取当前值,重新再来一遍。cas的底层是由汇编指令lo...
2020-04-14 22:40:10
2803
6
原创 从spring容器启动解析webmvc源码
Spring webmvc启动流程本文将从spring容器启动过程去分析springmvc源码,首先我们思考一个问题:web容器在启动的时候是怎么将bean解析并加载到spring容器中的,像我们自己如果要启动容器,那是不是要new ApplicationContext(),并且把xml配置文件路径或者包扫描路径传进去。那么webmvc是怎么解决这个问题的呢?以tomcat为例,我们的...
2020-04-11 12:01:28
206
原创 kafka API实践(kafka原理验证)
kafka生产者APIkafka生产者发送消息采用异步发送的方式,我们在写发送消息的代码的时候,会调用send方法,整个发送的过程涉及两个线程:main线程和sender线程,有一个重要的线程共享变量:RecordAccumulator,main线程将消息放到RecordAccumulator中缓存,serder线程不断从 RecordAccumulator中poll消息发送到 kafka(p...
2020-04-09 22:27:24
243
原创 Spring IOC循环依赖源码解析
本文主要针对spring IOC解决循环依赖的整个流程,从源码的角度对springioc bean注册、实例化,循环依赖作一个详细的讲解。
2020-04-03 23:58:55
892
原创 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
936
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
447
原创 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
8425
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人