- 博客(93)
- 资源 (28)
- 收藏
- 关注
原创 springboot自动装配总结
如何实现一个 Starter?记录一下springboot自动装配详解实战碰到得问题。1.springboot自动装配,新建一个父工程,建立两个module-模块(自动装配工程和要测试得工程)2.自动装配工程:新建一个自动装配类和META-INF\spring.factories文件3.测试工程:在java包下建一个包(XXX.XXXX),新建启动类使用@springbootApplication,很重要;test包下面也建包(XXX.XXXX),新建测试类测试.总结:1.测试工程必须要建一个启动类spri
2023-02-28 16:01:31
290
原创 Zookeeper选举Leader源码剖析(一)
1.启动或leader宕机选举流程2.客户端与服务端交互流程(NIO或Netty)3.写入数据的ZAB一致性协议(如何保证消息的顺序性)4.Watch监听触发机制。
2022-07-22 22:04:47
711
原创 PL/SQL碰到的坑
1.找到路径C\Users\用户名\AppData\Roming\PLSQLDEeveloper12\Preferences\用户名。2.打开user.prefs清空CurrentConnections。链接数据库太多,太凌乱了,清空一下recent中的链接。
2022-07-19 14:34:33
894
原创 Zookeeper典型使用场景实战
zookeeper分布式锁实现路径下加分布式锁,加监听锁的特性1.独占性(zookeeper只能生成一个相同节点)基于临时节点和临时顺序节点加分布式锁。
2022-07-16 22:37:07
1424
原创 Zookeeper客户端使用与经典应用场景
通过其他客户端对文件进行监听,第一个窗口 2.使用zookeeper客户端解决只能监听一次的问题2.1 客户端编写
2022-07-13 21:58:35
857
1
原创 Redis高并发分布式锁(学习总结)
0. 为什么要设计分布式锁?正常的数据库锁在实现的能实现数据库的原子性1. redis分布式锁实现官方推荐传送门!!!下面是redis官方推荐的三款客户端:
2022-06-29 21:51:39
168
原创 JDK7中ConcurrentHashMap源码解析
1. hashMap中扩容transfer时可能出现循环链表问题1. 使用头插法void addEntry(int hash, K key, V value, int bucketIndex) {//如果hashMap大小大于等于阈值并且数据元素不为空扩容 if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table.length);
2022-05-29 22:13:07
280
原创 JDK7与JDK8中的HashMap源码解析
1.jdk1.7 HashMaphashMap的数据结构:数组+链表ArrayList的初始值:10hashMap中为什么不用list的add方法,hashMap是key-value结构,在get(key)时需要遍历整个数组,效率上不如list.get(下标)效率高put操作:1.使用hashcode求余数组长度得出index数组下标值2.new Entry元素放入table[index]中1.1 构造方法构造方法,默认初始内存16,默认参数DEFAULT_LOAD_F
2022-05-27 22:36:33
179
原创 Future&CompletableFuture&Disruptor实战
1. 为什么需要callable接口传统的创建线程方式有两种:继承Thread和实现Runnable接口,两个都没有返回值,而且不能抛出异常。为了解决这个问题,java可以通过实现callable接口,重写call方式返回任务结果。@FunctionalInterfacepublic interface Runnable { public abstract void run();}@FunctionalInterfacepublic interface Callable<
2022-05-22 22:25:54
459
原创 并发编程之ForkJoin工作原理分析
1.任务类型1. CPU密集型任务 CPU密集型任务主要是用来发挥CPU的功能,加解密,计算等任务时推荐线程数是CPU核数的1-2倍。2. IO密集型任务 IO密集型任务是主要用于读写的任务,文件读写,数据库读写,通信等任务等,一般情况下推荐线程数是CPU核数的很多倍。线程数计算方法公式:线程数=CPU核数*(1+平均等待时间/平均工作时间) 最终的线程数结果需要压测获得,监测JVM的运行情况以及CPU的负载情况。1....
2022-05-20 22:31:27
306
原创 阻塞队列BlockingQueue实战及其原理分析二
1. SynchronousQueue介绍synchronousQueue是一个没有数据缓冲的阻塞队列,应用在newCachedThreadPool中,它的大小为0,每次取数据需要阻塞线程,存数据也需要阻塞线程。默认非公平锁,底层使用桟结构实现,公平锁使用队列结构实现。底层加锁使用CAS+自旋(默认512次)+(park/unpark)的形式保证性能。1.1 synchronousQueue实战两个生产者两个消费者:出现后进先出现象。符合非公平锁特性,底层使用桟结构实现。i
2022-05-16 22:19:40
568
原创 阻塞队列BlockingQueue实战及其原理分析
1.BlockingQueue介绍1. Queue(队列)顶层接口add(E) 添加元素,成功返回true,否则返回异常offer(E) 添加元素,成功返回true,否则返回falseremove() 返回并移除队首元素,队列为空返回异常poll()返回并移除队首元素,队列为空返回nullpeek() 获取队首元素,队列为空则返回nullBlockingQueue继承于Queue,提供了阻塞的特性,入队和出队都有常用的方法入队:put(E) offer(E) .
2022-05-14 22:33:22
425
原创 算法肝道夫之路
1.如何高效的刷算法题?五步刷题法:第一遍:尝试解决问题,解决不了背诵默写其他人的题解第二遍:快速将脑海中的题解写到leetcode上,尽量超过leetcode80%以上的人第三遍: 24小时以后重新刷第四遍: 一周以后重新刷题第五遍:面试一周或一个月前,重刷并手写代码(模拟真实环境)2. 1-002-算法时间复杂度分析常见时间复杂度O(1) 常数阶O(logn) 对数阶O(n) 线性阶O(nlogn) 线性对数阶O(n^2) 平方阶O(n^3)
2022-05-13 22:38:17
202
原创 深入理解AQS之ReentrantReadWriteLock详解
1.ReentrantReadWriteLock介绍应用场景:读读操作不存在并发问题,读写,写写,写读场景下需要互斥,需要一把锁锁住需要的资源。针对上述场景java实现了reentrantReadWriteLock,并且在java中实现了锁降级(写锁到读锁),公平与非公平选择,可重入。设计一把锁如何实现:继承AQS,实现抽象方法tryRelease和tryAcquire方法,其他方法可以使用AQS已经封装好的。管程:synchronizedAQS:cas+同步队列(获取锁失败阻塞)
2022-05-11 22:18:00
395
原创 深入理解AQS之CyclicBarrier&ReentrantReadWriteLock
1. CyclicBarrier介绍1.回顾一下AQS:同步等待队列 获取锁失败入队,阻塞条件等待队列:condition接口中很重要的两个方法await(),signal()/signalAllCyclicBarrier(循环屏障),可以让一组线程等待到计数器为某个值时执行业务,这个过程可以使用reset()重置重新使用。比contdownLatch要方便的一点就是这个。构造方法:public CyclicBarrier(int parties) //parties表示屏障拦截
2022-05-10 22:31:16
151
原创 深入理解AQS之Semaphore&CountDownLatch&Cyclic详解
1.Semaphoresemaphorer(信号量),是一个基于AQS框架实现的工具类,也是操作系统PV操作在java中的实现。通过发放许可来控制线程,只有拿到许可的线程才能执行代码,常用于限流操作。PV操作是一种操作系统实现进程互斥与同步的有效方法:P表示通过,V表示释放。P操作:S-1=X,如果X>=0线程执行,如果小于0放入等待队列中。V操作:S+1=X,如果X>=0线程执行,如果小于0从等待队列释放一个等待线程。构造器(默认非公平锁,也有公平锁实现):pu
2022-05-09 22:18:35
502
原创 深入理解AQS之独占锁ReentrantLock源码分析
1.java为什么要实现自己的管程机制?管程:操作系统底层实现的对线程并发问题实现的监视器机制,管程内部大致分为:同步等待队列和等待唤醒队列。同步等待队列的实现:synchronized在jvm底层保证线程能够串行化的操作同步代码块内的程序。等待唤醒队列的实现:java在object类中实现了monitor机制,每个对象都有一个monitor,可以手动调用wait/notify/notifyall方法操作线程。synchronized缺点:不能手动加锁解锁,synchronized内部加解
2022-05-05 22:46:00
767
原创 ZGC深度剖析
1.ZGC简介ZGC是一款jdk11版本支持下的垃圾回收器,支持TB级别的内存,12306抢票软件一般都是TB级别的内存,STW时间不超过1ms,ZGC的出现是为了抢占外部市场,比如安卓,大数据等。1.1 ZGC内存布局ZGC没有分代的概念。一般分为小页面(小于256k的对象分配),中页面(小于4M的对象分配),大页面(大于4M的对象分配)。垃圾回收器回收内存一般先回收小页面对象,中页面和大页面一般不回收。ZGC支持NUMA模型,UMA是在内存和...
2022-04-25 22:29:46
3893
原创 垃圾收集器G1&ZGC详解
目录1.G1垃圾收集器1.1 垃圾回收过程1.2 G1垃圾收集分类1.3 G1收集器核心参数手册2.ZGC垃圾收集器(面试不考)2.1 ZGC的内存布局2.2 ZGC的架构NUMA模型2.3 ZGC运作过程2.4 颜色指针和读屏障1.G1垃圾收集器G1垃圾收集器是一款面向多CPU,大内存的垃圾收集器,内部采用region内存块的概念,将内存块分为多个,里面将内存块划分为Eden,survivor,old,humongous(大对象存储)区域。并不是连续...
2022-04-23 19:43:23
1712
1
原创 垃圾收集器ParNew&CMS与底层三色标记算法详解
1.垃圾收集算法常用的垃圾收集算法:分代收集理论(年轻代和老年代分别使用不同的垃圾回收算法),标记-复制算法(年轻代),标记整理算法(老年代),标记清除算法(老年代)。1.1 标记-复制算法标记复制算法,会将内存分为两块,一半使用过的内存块,一半未使用的内存块,在进行垃圾收集时,将还存活的对象复制整理到未使用的内存块,整理过后将使用过的内存块清除。主要在年轻代中使用这个算法。缺点:浪费内存,每次1G的内存只能使用500M。1.2 标记-清除算法...
2022-04-21 22:12:17
1246
原创 JVM字节码文件结构深度剖析
目录1. 字节码文件结构2. 字节码文件实战2.1 常量池表2.2 访问标记符号1. 字节码文件结构使用javap -v *.class 查看字节码文件,字节码文件遵循一定的规律。规律如下图2. 字节码文件实战本地随便找的一个字节码文件,用UE打开以后显示如下。解读如下,默认都是16进制。1.固定魔法值:CA FE BA BE2.次版本号:00 003.主版本号:00 34 (转换成10进制->4*16^0+3*16^1=52 ,...
2022-04-18 22:30:57
836
原创 JVM内存分配机制详解
1. JVM内存分配机制(TODO)A a = new A()过程分为:1. 类加载检查,如果加载过进行下一步,没有加载过使用类加载器加载类2. 分配内存3. 初始化4. 设置对象头5. 执行init方法1.1 jvm分配内存jvm分配内存方式:1.指针碰撞:将一块内存分配为已使用和未使用,中间分配使用指针分隔,分配内存就是将指针移动到与对象大小相同的内存块处。2.空闲列表:一般内存中可能有不相邻的内存块,虚拟机会维护一...
2022-04-14 20:35:01
1603
原创 JVM内存模型深度剖析与优化
目录1. Tomcat类加载器机制2. jdk体系结构与跨平台特性3. JVM内存结构3.1 jvm内存指令手册3.2 使用jvisualvm工具查看对象回收4. jvm常用参数设置4.1 模拟桟溢出实战1. Tomcat类加载器机制tomcat为什么可以多个war包共存,tomcat每有一个war包都会加载一个war包的类加载器,这个类加载器叫webappclassLoader。每个jsp都会使用自己的类加载器加载,所以不需要编译就可以生效。...
2022-04-13 23:01:09
628
原创 从JDK源码级别彻底剖析JVM类加载机制
1. main方法执行流程我们平常使用的main方法,右键执行main方法在底层加载步骤大致如下。2. 类加载过程上述classloader.loadclass过程大致细分为以下步骤:加载:加载类文件到类加载器验证:文件是否符合格式,默认开头CAFA BA BE格式,格式不能随意更改准备:初始化值,int默认0,对象默认null,不影响最终声明的值解析:将符号引用替换为直接引用,符号引用是我们所有看到的java符号都是符号引用,存在一个常量池中,可以使用javap.
2022-04-12 23:09:16
485
原创 软件工程-基础篇刷题
1.操作系统原理1.1 进程的概念进程是操作系统管理任务的最小单位。除了进程,还有线程,线程是为了处理进程中更细小的任务,操作系统中的CPU为了处理线程中的任务需要经常切换,这就涉及到串行,并行,并发的概念。串行:一个任务执行完毕,另外一个任务才能执行。并行:在单位时间内,多个任务同时执行。现在的多核CPU支持多个任务处理。并发:在单位时间内,只能处理一个任务,其他任务获取到CPU时间片就会开始执行另外一个任务,操作系统本身会进行用户态和内核态的切换。1.2进程的状态..
2022-04-03 21:42:59
1767
原创 SpringBoot整合RabbitMq与高级特性
1.springboot整合rabbitMQ1.1 springboot整合rabbitMQ消费者1.导入pom.xml依赖2.定义队列,交换机,队列绑定交换机关系3.定义springboot启动类4. 创建测试springboot启动类#rabbitMQ主要依赖<dependency> <groupId>org.springframework.boot</groupId> <ar.
2022-03-31 21:40:17
1896
原创 RabbitMq工作模式深度剖析与Spring整合MQ
书接上回:RabbitMq概述与工作模式深度剖析_bingtanghulu_6的博客-优快云博客工作模式代码已经发到gitee仓库,需要的自取。代码路径:https://gitee.com/GengHongBo/rabbit-mqtest.git1.Publish/Subscribe(发布-订阅模式)发布订阅模式对象:发布者,交换机,队列,消费者1,消费者2。多个队列绑定交换机,交换机会给每个队列发送消息。使用场景:up主跟粉丝订阅消息的场景;天气预报跟百度,微博等天气专栏的关系。..
2022-03-29 19:26:24
2393
原创 RabbitMq概述与工作模式深度剖析
1. 什么是MQ?MQ全称Message Queue,是一种分布式系统中生产者和消费者之间保存消息的容器。2.MQ的优劣势mq的优点:1. 跟其他系统解耦,生产者中的消息放入MQ进行处理,不需要直接跟其他系统交互,避免造成整个分布式系统挂掉。2.异步处理,其他系统由原有的同步处理请求改为异步处理,响应和请求速度加快。3. 削峰填谷,在秒杀情景下,对大批量请求放入mq后不会造成系统压力。缺点:1.宕机后造成其他系统无法请求 2.系统复杂度提高3.常见的MQ...
2022-03-26 22:07:22
2398
3
原创 POI与EasyExcel读写测试
1.POI1.1 POI写入测试1.2 POI读取测试2.EasyExcel2.1 EasyExcel写入测试2.2 EasyExcel读取测试
2022-03-24 21:53:35
980
原创 自动化监控系统Prometheus&Grafana入门实战
1.什么是Prometheus?什么是Grafana?Prometheus是一款运维人员使用的自动化监控系统,主要就做以下几件事:数据收集->数据处理->数据存储->数据展示->告警。而数据展示部分Prometheus自带的webUI太丑了,更推荐使用Grafana图形化工具来展示。Prometheus官网:Prometheus - Monitoring system & time series databaseGrafana官网:Grafana: The op
2022-02-18 07:41:55
201
原创 docker入门与部署微服务实战
目录0.问题1.什么是docker?2.docker架构3.docker安装4.docker常用命令4.1 常用docker命令4.2 容器相关命令4.3 dockerfile常用命令及构建docker镜像5.部署微服务镜像6.推送远程仓库7.docker虚拟化原理0.问题1.容器内安装vim,ping,ifconfig等指令发现apt无法使用2.docker部署ngnix和微服务无法使用浏览器访问3.docker推送远程仓库未成功1.
2022-02-13 21:03:27
248
原创 并发编程之CAS和Atomic原子操作类
目录1. 什么是CAS?2. CAS的java实现2.1创建一个工厂类获取unsafe对象2.2 测试unsafe的三个方法3.ABA问题3.1 什么是ABA问题?3.1 ABA解决方案4.Atomic原子操作类详解4.1AtomicInteger4.2AtomicIntegerArray4.3AtomicReference4.4AtomicIntegerFieldUpdater4.5LongAdder4.6LongAccum...
2022-02-09 22:04:25
612
原创 并发编程之深入理解
如果没有sysstat可以使用以下命令安装[root@localhost ~]# yum install sysstat下面的问题都是线程的一些基础知识,面试的时候经常会问到,总结一波1. 线程与进程的区别进程是操作系统执行的最小单元,线程是CPU执行的最小单元,进程包含线程,一个线程必须有一个父进程,比如下面任务管理器中的示例2.线程同步与线程互斥的区别线程同步就是说线程之间的依赖关系,线程之间如果没有响应就会等待直至唤醒。线程互斥是说进程之间的资源是共...
2022-02-08 20:54:25
641
1积分 mysql-connector-java-5.1.13-bin
2017-09-28
1积分 mysql-connector-java-commercial-5.1.25-bin.jar
2017-09-28
WinRAR 5.5-Beta-32&64安装包
2017-09-25
Winscp 安装包
2017-09-24
TortoiseSVN-1.7.6.22632 安装包
2017-09-24
FastStone+Capture+_28屏幕捕捉工具
2017-09-24
jdk-6-rc-windows-i586安装包
2017-09-24
SSHSecureShellClient-3.2.9安装包
2017-09-24
DbVisualizer6.5安装包
2017-09-24
DbVisualizer-6.0.2安装包
2017-09-24
dbvis_windows-x64_9_0_2_jre
2017-09-24
jd-gui安装包
2017-09-24
redis-desktop-manager-0.8.3.3850
2017-09-24
tomcat5.5安装包
2017-09-24
RedisStudio-en-0.1.5安装包
2017-09-24
虹光AV220C2扫描仪驱动安装包
2017-09-24
AVISIONav220c2 安装包
2017-09-24
navicat_premium_x64安装包
2017-09-24
apache-tomcat-7.0.79安装包
2017-09-24
tomcat5.0.28压缩包
2017-09-24
SunWebScan_Setup_20161208安装包
2017-09-24
EasyScanV5.0.0.1(20170703)_v12(multi)
2017-09-24
mysql-connector-odbc-3.51.30-winx64安装包
2017-09-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人