自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 RabbitMq如何保证消息不丢失

rabbitMq在由于网络传输的不稳定因素,在以下四点可能出现消息丢失的情况。针对于第1点:1、消息发送+回调。2、采用事务的方式chanle.txSelect(),但是会阻塞通道,造成吞吐量下降。3、publisher confirm方式,采用RocketMQ的思想,分布式事务,也是RabbitMq新版本的扩展点。针对于第2点:1、使用镜像队列,rabbitMq普通集群每一个节点之间的数据是不会同步的,自己存自己的,当消费者消费消息在某个几点找不到时,就会去其他的.

2021-08-07 21:37:02 674

原创 zookeeper实现分布式锁源码解析

利用zk实现分布式锁的原理:curator框架对分布式锁的实现: //获取zookpeer连接 CuratorFramework curatorFramework = getCuratorFramework(); //创建分布式锁 InterProcessMutex interProcessMutex = new InterProcessMutex(curatorFramework, "/lock"); //.

2021-08-06 14:39:47 275

原创 线程中捕获异常

总结:正常线程抛出异常时,在外部是捕捉不到的,当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。解决方案:为线程添加未捕获异常处理器(UncaughtExceptionHandler),实现UncaughtExceptionHandler接口,重写uncaughtException方法,在方法内捕获异常。案例:public class ExceptionThread2 implements Runnab

2021-06-22 13:44:54 617 1

原创 Redis核心技术与实战笔记

02 | 数据结构:快速的Redis有哪些慢操作?底层数据结构一共有 6 种:分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。它们和数据类型的对应关系如下图所示:它们的特点是一个键对应了一个集合的数据。键和值用什么结构组织: Redis 解决哈希冲突的方式,就是链式哈希。链式哈希也很容易理解,就是指同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。其实,为了使 rehash 操作更高效,Redis 默认使用了两个全局哈...

2021-04-04 11:00:55 462 1

原创 sleep、wait、yield、join

sleepsleep 方法是属于Thread 类中的,sleep 过程中线程不会释放锁,只会阻塞线程,让出cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,可中断,sleep 给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会。waitwait 方法是属于 Object 类中的,wait过程中线程会释放对象锁,只有当其他线程调用 notify才能唤醒此线程。wait 使用时必须先获取对象锁,即必须在 synchronized 修饰...

2021-03-12 10:21:34 121

原创 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 100

转载 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 146

原创 统一门户添加新的页面

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 369

原创 springboot多数据源的配置

dao.properties 文件存放数据库连接名和密码。dao-datasource.xml 用来连接数据库的配置文件。<!-- 历史 --><bean id="hisDataSource" parent="abstractDataSource"> <property name="url" value="#{coreDao['h...

2020-03-18 13:49:08 189

原创 RabbitMq笔记

应用场景 RabbitMQ,或者说AMQP解决了什么问题,或者说它的应用场景是什么? 对于一个大型的软件系统来说,它会有很多的组件或者说模块或者说子系统或者(subsystem or Component or submodule)。那么这些模块的如何通信?这和传统的IPC有很大的区别。传统的IPC很多都是在单一系统上的,模块耦合性很大,不适合扩展(Scalabilit...

2020-01-20 16:17:24 207

原创 SpringBoot自定义starter

starter:1、这个场景需要使用到的依赖是什么?2、如何编写自动配置@Configuration //指定这个类是一个配置类@ConditionalOnXXX //在指定条件成立的情况下自动配置类生效@AutoConfigureAfter //指定自动配置类的顺序@Bean //给容器中添加组件@ConfigurationPropertie结合相关xxxProp...

2019-11-14 11:55:54 159

原创 注册中心

一、创建名为: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 288

原创 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 119

原创 SpringBoot自动配置原理

自动配置原理配置文件到底能写什么?怎么写?自动配置原理; 配置文件能配置的属性参照1、自动配置原理:1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration2)、@EnableAutoConfiguration 作用: 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?...

2019-11-06 09:39:36 127

原创 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 111

原创 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 146

原创 SpringBoot笔记之入门

一、Spring Boot 入门1、Spring Boot 简介简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案;2、微服务微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元; 详细...

2019-11-05 21:13:30 108

原创 springboot:java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException

找了好久原因,终于找到根源,麻烦留个赞:将jdk目录下的jre下的ext下的servlet-api.jar删除即可

2019-10-28 20:05:55 715

原创 手写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 107

原创 红黑树原理

什么是红黑树红黑树是带有着色性质的二叉查找树。性质如下:① 每一个节点或者着成红色或者着成黑色。② 根节点为黑色。③ 每个叶子节点为黑色。(指的是指针指向为NULL的叶子节点)④ 如果一个节点是红色的,那么它的子节点必须是黑色的。⑤ 从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。推论: 有n个节点的红黑树的高度最多是2log(N+1) 。红黑树旋转操作...

2019-07-15 10:53:18 187

原创 225. 用队列实现栈

使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back, peek/pop from front, size, 和is empty这些操作是合法的。你所使用的语言也许不支持队列。你可以使用 list 或者...

2019-07-14 23:06:13 112

原创 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 94

原创 20. 有效的括号

给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例2:输入: "()[]{}"输出: true示例3:输入: "(]"输出: false示例4:输...

2019-07-14 20:07:13 97

原创 24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.解题思路:设置一个辅助头结点,交换两个节点的位置,需要操作三个节点,所以每次操作三个节点。/** * Definition for ...

2019-07-14 20:04:50 107

原创 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 92

原创 JVM内存结构

所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。先看一张图,这张图能很清晰的说明JVM内存结构布局。Ja...

2019-07-13 11:20:30 94

原创 类加载机制

1、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被“首次主动使...

2019-07-13 11:18:20 93

原创 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 461

原创 ArrayList面试

ArrayList的底层数据结构是数组,具有索引,所以它的特点是:查询效率高,但增加和删除元素效率比较低。ArrayList实现了List接口,RandomAccess接口,cloneable接口,serializeable接口。其中实现这个RandomAccess接口,证明其具有随即快速访问能力。因为其底层数据结构是数组,所以它是有长度的。如果超出这个长度就会触发扩容机制,这个扩容机制是...

2019-07-11 22:59:34 637

原创 java反射原理

java反射就是将一个类的各个组成部分封装为其他的对象。获取Class对象的三种方式:①Class.forName("全类名"):多用于配置文件,将类定义在配置文件当中,通过读取配置文件,加载类。②类名.class:多用于参数的传递。③对象.getClass():多用于通过对象获取该对象的字节码。我们已经知道,main()方法是程序的入口。那是不是在main()方...

2019-07-02 17:27:03 137

原创 java不常见的知识点

1、变量进制表示:二进制:以0b开头八进制:以0开头十六进制:以0x开头2、方法区里存放什么源代码类信息静态变量静态方法字符串常量池3、Integer的缓存机制Integer在[-128,127]之间的数会缓存,实际是在系统初始化的时候就会创建一个cache数组存放-128到127,其类型为Integer。在调用valueOf的时候,首先会看是否在-12...

2019-07-02 16:26:25 177

原创 JVM之四种对象引用

强引用: JVM默认的就是强引用,new一个对象放在堆内存,然后用一个引用指向它,这就是强引用。如果一个对象具有强引用,那垃圾回收器是绝对不会回收它的,当内存空间不足的时候,java虚拟机宁愿抛出OutOfMemoryError错误,也不愿回收具有强引用的对象来解决内存不足问题。软引用: 软引用(java.lang.r...

2019-05-12 14:28:47 289

原创 多线程CAS

CAS只是一种思想,就是比较并替换。它有三个操作数:内存值V,旧的预期值A,要修改的新值B。只有当预期值A和内存值V相同的时候,才将内存值V修改为新值B,并返回ture。否则什么都不做,返回false。CAS一定要与volatile变量配合使用,这样才能保证线程每次拿到的变量都是主内存中最新的那个值,否则,旧的预期值A对某个线程来说,可能永远是一个不会变的值A。实现:Actomic原子类就是使...

2019-05-06 19:37:19 598 1

原创 深度解析:读写锁原理

对于多个线程共享同一个资源的时候,多个线程同时对共享资源做读操作是不会发生线程安全性问题的,但是一旦有一个线程对共享数据做写操作其他的线程再来读写共享资源的话,就会发生数据安全性问题,所以出现了读写锁ReentrantReadWriteLock。读写锁允许多个线程同时获取读锁,但有一个线程获取写锁之后其他线程都会进入等待队列进行等待。读写锁的写锁是一把独占锁,它与ReentrantLock的原...

2019-05-05 22:00:07 8582

原创 深度解析:Fork/Join框架

Fork/Join框架是一个用于并行执行任务的框架,它的出现是为了适应多核处理器时代,提高cpu的利用率。核心思想是把一个大任务分割成若干个小任务,汇总每个小任务的结果作为大任务的结果。Fork/Join框架要完成两件事:1、Fork(任务分割):就是将一个大任务分割成足够小的子任务。2、Join(执行任务并合并结果):分割的子任务会分别保存到双端队列里,然后几个启动线程会到这个双端队列里...

2019-05-04 22:09:31 250 1

原创 深度解析:多线程Future

Future其实是一种设计模式,它的核心思想:假如有一个方法f,它的计算过程是相当耗时的,显然直接获取结果是不明智的,因为需要等待它计算完才能返回。所以可以在调用方法f的时候让它返回一个Future,通过这个Future可以监控和控制方法f的计算过程。它有几个核心方法:get():获取返回值结果。cancel():取消方法的执行过程。isDown():判断方法是否执行完成。isCa...

2019-05-03 21:26:55 229

原创 深度解析:CountDownLatch、CyclicBarrier、Semaphore基本原理

CountDownLatch、CyclicBarrier、Semaphore都是基于AQS实现的同步组件。CountDownLatch原理:CountDownLatch初始化的时候需要指定一个初始值,调用了CountDownLatch的await方法的线程就会处于阻塞状态,会将阻塞的线程生成一个node节点放进AQS的同步队列中,每个线程在调用CountDownLatch的countDow...

2019-05-02 21:58:05 403

原创 最全创建线程的方式

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 109

原创 实现线程安全的四种方式

首先说说什么是线程安全性问题,多个线程共享同一个全局变量或静态变量,多个线程同时读数据不会发生数据安全性问题,但是有一个线程对数据进行写的时候,再有其他的线程来读写共享数据就有可能发生线程安全性问题。线程安全性问题出现的三个必要条件:1、多线程环境下2、多个线程共享同一个资源3、对资源进行非原子性操作解决线程安全的四种方式:1、synchronized锁(偏向锁,轻量级锁,...

2019-05-01 23:05:36 10672

原创 深度解析:偏向锁、轻量级锁、重量级锁

在JDK1.5之后java官方对synchronized进行了加强,为其增加了偏向锁,轻量级锁,重量级锁。偏向锁:优点:减少无竞争且只有一个线程使用锁的情况下,使用轻量级锁产生的性能系消耗。偏向锁假定未来只有第一个申请锁的线程会使用锁,不会再有任何线程来申请锁。因此,只需要Mark Word中CAS记录ower,如果记录成功,则偏向锁获取成功,记录锁状态为偏向锁,以后,当前线程就等...

2019-05-01 22:41:40 176

文件上传jar包

封装了javaweb文件上传技术的jar包,该jar包可以做到一步上传文件,非常方便,欢迎大家共同探讨

2019-01-18

空空如也

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

TA关注的人

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