- 博客(56)
- 资源 (1)
- 收藏
- 关注
原创 RabbitMq如何保证消息不丢失
rabbitMq在由于网络传输的不稳定因素,在以下四点可能出现消息丢失的情况。针对于第1点:1、消息发送+回调。2、采用事务的方式chanle.txSelect(),但是会阻塞通道,造成吞吐量下降。3、publisher confirm方式,采用RocketMQ的思想,分布式事务,也是RabbitMq新版本的扩展点。针对于第2点:1、使用镜像队列,rabbitMq普通集群每一个节点之间的数据是不会同步的,自己存自己的,当消费者消费消息在某个几点找不到时,就会去其他的.
2021-08-07 21:37:02 707
原创 zookeeper实现分布式锁源码解析
利用zk实现分布式锁的原理:curator框架对分布式锁的实现: //获取zookpeer连接 CuratorFramework curatorFramework = getCuratorFramework(); //创建分布式锁 InterProcessMutex interProcessMutex = new InterProcessMutex(curatorFramework, "/lock"); //.
2021-08-06 14:39:47 305
原创 线程中捕获异常
总结:正常线程抛出异常时,在外部是捕捉不到的,当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。解决方案:为线程添加未捕获异常处理器(UncaughtExceptionHandler),实现UncaughtExceptionHandler接口,重写uncaughtException方法,在方法内捕获异常。案例:public class ExceptionThread2 implements Runnab
2021-06-22 13:44:54 650 1
原创 Redis核心技术与实战笔记
02 | 数据结构:快速的Redis有哪些慢操作?底层数据结构一共有 6 种:分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示:它们的特点是一个键对应了一个集合的数据。键和值用什么结构组织: Redis 解决哈希冲突的方式,就是链式哈希。链式哈希也很容易理解,就是指同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。其实,为了使 rehash 操作更高效,Redis 默认使用了两个全局哈...
2021-04-04 11:00:55 597 1
原创 sleep、wait、yield、join
sleepsleep 方法是属于Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会。waitwait 方法是属于 Object 类中的,wait过程中线程会释放对象锁,只有当其他线程调用 notify才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰...
2021-03-12 10:21:34 144
原创 linux常用命令
1、查看服务器整体性能:top主要看cpu和内存的占用,还有右上角load average指标:主要代表一分钟,五分钟,十五分钟cpu的负载情况,如果三个数的平均值大于0.6,那么就代表服务器压力较大。2、vmstat 查看cpu性能(CPU)3、mpstat 查看所有cpu核的信息(CPU)每两秒打印一遍所有cpu核的信息。4、free -m 查看内存信息(内存)5、df -h 查看磁盘情况(硬盘)6、iosta...
2021-03-12 01:36:24 108
转载 Lambda表达式
java内嵌四种函数式接口以便直接使用LambdaConsumer<T> : 消费型接口void accpt(T t);Supplier<T> : 供给型接口T get();Function<T, R> : 函数型接口R apply(T t);Predicate<T> : 断言型接口boolean tets(T t);...
2020-04-24 18:04:47 153
原创 统一门户添加新的页面
1、在 permisssionConstant.js中添加 页面节点 和 功能节点DF0028:"virtual_smp_bap_df_DfPayResult",//代付异步推送结果查询DF2801:"virtual_smp_bap_df_DfPayResult_query",//查询2、在menu.jsp中配置if(hasPermission(PERMISSSIONCO...
2020-03-24 14:23:42 390
原创 springboot多数据源的配置
dao.properties 文件存放数据库连接名和密码。dao-datasource.xml 用来连接数据库的配置文件。<!-- 历史 --><bean id="hisDataSource" parent="abstractDataSource"> <property name="url" value="#{coreDao['h...
2020-03-18 13:49:08 197
原创 RabbitMq笔记
应用场景 RabbitMQ,或者说AMQP解决了什么问题,或者说它的应用场景是什么? 对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalabilit...
2020-01-20 16:17:24 211
原创 SpringBoot自定义starter
starter:1、这个场景需要使用到的依赖是什么?2、如何编写自动配置@Configuration //指定这个类是一个配置类@ConditionalOnXXX //在指定条件成立的情况下自动配置类生效@AutoConfigureAfter //指定自动配置类的顺序@Bean //给容器中添加组件@ConfigurationPropertie结合相关xxxProp...
2019-11-14 11:55:54 187
原创 注册中心
一、创建名为:eureka的模块(注册中心)gradle依赖:dependencies { compile("org.springframework.cloud:spring-cloud-starter-netflix-eureka-server") compile("org.springframework.boot:spring-boot-starter") ...
2019-11-13 14:59:37 319
原创 kafka在windows上安装
WINDOWS上KAFKA运行环境安装1. 安装JDK1.1 安装文件:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK1.2 安装完成后需要添加以下的环境变量(右键点击“我的电脑” -> "高级系统设置" -> "环境变量"):JAVA_HOME:C:\Program F...
2019-11-07 14:54:42 124
原创 SpringBoot自动配置原理
自动配置原理配置文件到底能写什么?怎么写?自动配置原理; 配置文件能配置的属性参照1、自动配置原理:1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration2)、@EnableAutoConfiguration 作用: 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?...
2019-11-06 09:39:36 152
原创 SpringBoot配置文件
配置文件1、配置文件SpringBoot使用一个全局的配置文件,配置文件名是固定的;application.properties application.yml配置文件的作用:修改SpringBoot自动配置的默认值;(SpringBoot在底层都给我们自动配置好了)YAML(YAML Ain’t Markup Language) YAML A Markup Language:...
2019-11-06 09:37:31 138
原创 SpringBoot底层原理
Hello World探究1、POM文件1、父项目<parent><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐starter‐parent</artifactId><version>1.5.9.RELEASE</...
2019-11-06 09:28:03 159
原创 SpringBoot笔记之入门
一、Spring Boot 入门1、Spring Boot 简介简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案;2、微服务微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元; 详细...
2019-11-05 21:13:30 134
原创 springboot:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException
找了好久原因,终于找到根源,麻烦留个赞:将jdk目录下的jre下的ext下的servlet-api.jar删除即可
2019-10-28 20:05:55 761
原创 手写SpringIOC
核心两个类:BeanFactory 和 BeanDefinitionBeanFactory:import java.io.FileInputStream;import java.io.InputStream;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.HashMap;imp...
2019-08-08 11:35:56 128
原创 红黑树原理
什么是红黑树红黑树是带有着色性质的二叉查找树。性质如下:① 每一个节点或者着成红色或者着成黑色。② 根节点为黑色。③ 每个叶子节点为黑色。(指的是指针指向为NULL的叶子节点)④ 如果一个节点是红色的,那么它的子节点必须是黑色的。⑤ 从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。推论: 有n个节点的红黑树的高度最多是2log(N+1) 。红黑树旋转操作...
2019-07-15 10:53:18 195
原创 225. 用队列实现栈
使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back, peek/pop from front, size, 和is empty这些操作是合法的。你所使用的语言也许不支持队列。你可以使用 list 或者...
2019-07-14 23:06:13 133
原创 232. 用栈实现队列
使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue....
2019-07-14 22:51:49 114
原创 20. 有效的括号
给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false示例4:输...
2019-07-14 20:07:13 119
原创 24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.解题思路:设置一个辅助头结点,交换两个节点的位置,需要操作三个节点,所以每次操作三个节点。/** * Definition for ...
2019-07-14 20:04:50 112
原创 206. 反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解题思路:设置三个指针,pre,cur,next,遍历所有节点,依次将所有节点的后继节点指向前一个节点。public class Solution { public ListNode reverseLi...
2019-07-14 19:28:56 95
原创 JVM内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。先看一张图,这张图能很清晰的说明JVM内存结构布局。Ja...
2019-07-13 11:20:30 100
原创 类加载机制
1、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被“首次主动使...
2019-07-13 11:18:20 103
原创 HashMap面试
本文准备从以下几个方面去讲解HashMap:1)HashMap源码详细分析2)HashMap为什么是线程不安全的?3)HashMap和HashTable的区别4)1.7和1.8的HashMap实现区别总结HashMap源码分析一、构造函数让我们先从构造函数说起,HashMap有四个构造方法,别慌1.1 HashMap() // 1.无参构造方法、 // ...
2019-07-12 21:56:52 493
原创 ArrayList面试
ArrayList的底层数据结构是数组,具有索引,所以它的特点是:查询效率高,但增加和删除元素效率比较低。ArrayList实现了List接口,RandomAccess接口,cloneable接口,serializeable接口。其中实现这个RandomAccess接口,证明其具有随即快速访问能力。因为其底层数据结构是数组,所以它是有长度的。如果超出这个长度就会触发扩容机制,这个扩容机制是...
2019-07-11 22:59:34 663
原创 java反射原理
java反射就是将一个类的各个组成部分封装为其他的对象。获取Class对象的三种方式:①Class.forName("全类名"):多用于配置文件,将类定义在配置文件当中,通过读取配置文件,加载类。②类名.class:多用于参数的传递。③对象.getClass():多用于通过对象获取该对象的字节码。我们已经知道,main()方法是程序的入口。那是不是在main()方...
2019-07-02 17:27:03 144
原创 java不常见的知识点
1、变量进制表示:二进制:以0b开头八进制:以0开头十六进制:以0x开头2、方法区里存放什么源代码类信息静态变量静态方法字符串常量池3、Integer的缓存机制Integer在[-128,127]之间的数会缓存,实际是在系统初始化的时候就会创建一个cache数组存放-128到127,其类型为Integer。在调用valueOf的时候,首先会看是否在-12...
2019-07-02 16:26:25 186
原创 JVM之四种对象引用
强引用: JVM默认的就是强引用,new一个对象放在堆内存,然后用一个引用指向它,这就是强引用。如果一个对象具有强引用,那垃圾回收器是绝对不会回收它的,当内存空间不足的时候,java虚拟机宁愿抛出OutOfMemoryError错误,也不愿回收具有强引用的对象来解决内存不足问题。软引用: 软引用(java.lang.r...
2019-05-12 14:28:47 297
原创 多线程CAS
CAS只是一种思想,就是比较并替换。它有三个操作数:内存值V,旧的预期值A,要修改的新值B。只有当预期值A和内存值V相同的时候,才将内存值V修改为新值B,并返回ture。否则什么都不做,返回false。CAS一定要与volatile变量配合使用,这样才能保证线程每次拿到的变量都是主内存中最新的那个值,否则,旧的预期值A对某个线程来说,可能永远是一个不会变的值A。实现:Actomic原子类就是使...
2019-05-06 19:37:19 621 1
原创 深度解析:读写锁原理
对于多个线程共享同一个资源的时候,多个线程同时对共享资源做读操作是不会发生线程安全性问题的,但是一旦有一个线程对共享数据做写操作其他的线程再来读写共享资源的话,就会发生数据安全性问题,所以出现了读写锁ReentrantReadWriteLock。读写锁允许多个线程同时获取读锁,但有一个线程获取写锁之后其他线程都会进入等待队列进行等待。读写锁的写锁是一把独占锁,它与ReentrantLock的原...
2019-05-05 22:00:07 8700
原创 深度解析:Fork/Join框架
Fork/Join框架是一个用于并行执行任务的框架,它的出现是为了适应多核处理器时代,提高cpu的利用率。核心思想是把一个大任务分割成若干个小任务,汇总每个小任务的结果作为大任务的结果。Fork/Join框架要完成两件事:1、Fork(任务分割):就是将一个大任务分割成足够小的子任务。2、Join(执行任务并合并结果):分割的子任务会分别保存到双端队列里,然后几个启动线程会到这个双端队列里...
2019-05-04 22:09:31 258 1
原创 深度解析:多线程Future
Future其实是一种设计模式,它的核心思想:假如有一个方法f,它的计算过程是相当耗时的,显然直接获取结果是不明智的,因为需要等待它计算完才能返回。所以可以在调用方法f的时候让它返回一个Future,通过这个Future可以监控和控制方法f的计算过程。它有几个核心方法:get():获取返回值结果。cancel():取消方法的执行过程。isDown():判断方法是否执行完成。isCa...
2019-05-03 21:26:55 258
原创 深度解析:CountDownLatch、CyclicBarrier、Semaphore基本原理
CountDownLatch、CyclicBarrier、Semaphore都是基于AQS实现的同步组件。CountDownLatch原理:CountDownLatch初始化的时候需要指定一个初始值,调用了CountDownLatch的await方法的线程就会处于阻塞状态,会将阻塞的线程生成一个node节点放进AQS的同步队列中,每个线程在调用CountDownLatch的countDow...
2019-05-02 21:58:05 427
原创 最全创建线程的方式
1、继承Thread类package cn.skq.thread1;class ThreadTest extends Thread{ @Override public void run() { System.out.println("我是一个小线程"); }}public class Test { public static void main(String[] args...
2019-05-02 20:30:58 119
原创 实现线程安全的四种方式
首先说说什么是线程安全性问题,多个线程共享同一个全局变量或静态变量,多个线程同时读数据不会发生数据安全性问题,但是有一个线程对数据进行写的时候,再有其他的线程来读写共享数据就有可能发生线程安全性问题。线程安全性问题出现的三个必要条件:1、多线程环境下2、多个线程共享同一个资源3、对资源进行非原子性操作解决线程安全的四种方式:1、synchronized锁(偏向锁,轻量级锁,...
2019-05-01 23:05:36 10710
原创 深度解析:偏向锁、轻量级锁、重量级锁
在JDK1.5之后java官方对synchronized进行了加强,为其增加了偏向锁,轻量级锁,重量级锁。偏向锁:优点:减少无竞争且只有一个线程使用锁的情况下,使用轻量级锁产生的性能系消耗。偏向锁假定未来只有第一个申请锁的线程会使用锁,不会再有任何线程来申请锁。因此,只需要Mark Word中CAS记录ower,如果记录成功,则偏向锁获取成功,记录锁状态为偏向锁,以后,当前线程就等...
2019-05-01 22:41:40 182
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人