自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 shp文件和geojson实现互转

shp文件和geojson互转

2022-10-26 16:17:46 1551 1

原创 Spring MVC源码——初始化及请求处理

Spring MVC源码——初始化及请求处理

2022-07-21 20:08:00 566

原创 GeoTools --- geoJson 转 SimpleFeatureCollection 并实现裁剪功能

geoJson 转 SimpleFeatureCollection 并实现裁剪功能

2022-07-21 16:06:03 1897

原创 实现DOC、DOCX转换为PDF 再将PDF转换为图片

实现DOC、DOCX转换为PDF 再将PDF转换为图片

2022-07-20 15:04:19 1885

原创 记一次Process.waitFor阻塞的坑

## 记一次Process.waitFor阻塞的坑

2022-07-19 17:50:25 560

原创 netty源码-FastThreadLocal

netty源码

2022-07-17 13:23:14 294

原创 netty源码--NioEventLoop的run方法

netty框架源码分享

2022-07-14 21:34:05 348

原创 netty源码--ServerBootstrap的初始化及启动流程

netty源码之Serverbootstrap

2022-07-10 21:52:54 692

原创 netty源码--NioEventLoopGroup的初始化

关于netty源码知识分享

2022-07-09 23:02:57 341

原创 设计模式01-七大设计原则

设计模式01-七大设计原则文章目录设计模式01-七大设计原则开闭原则-Open Close依赖倒置原则-Dependence Inversion单一职责原则-Simple ResponsiBility接口隔离原则-Interface Segregation迪米特法则-Law of Demeter里氏替换原则-Liskov Substitution合成(组合)、复用原则-Composite&Aggregate Reuse开闭原则-Open Close一个软件实体如类、模块、函数应该对扩展开放,对

2022-01-23 22:25:08 242

原创 Mybatis面试题

文章目录0,Mybatis执行流程1,什么是mybatis?2,mybatis优缺点优点缺点3,#{}和${}的区别是什么?4,通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?5,Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?6、Mybatis是如何进行分页的?分页插件的原理是什么?7,Mybatis的一级二级缓存0,Mybatis执行流程@Testpublic void test()

2021-09-16 14:09:33 121

原创 Kafka学习笔记

Kafka学习笔记文章目录Kafka学习笔记概念应用场景消息队列的两种模式点对点模式发布/订阅模式Kafka的基础架构KafKa入门安装配置文件介绍伪集群搭建配置文件启动/关闭KafKa命令行操作查看服务器中所有的topic:创建topic删除topic发送消息消费消息查看某个topic详情修改分区数KafKa架构深入Kafka工作流程KafKa文件存储机制![在这里插入图片描述](https://img-blog.csdnimg.cn/587a6d6781fd4c7a80611c3db37bfa94.p

2021-09-05 21:42:05 179

原创 Java实现DOCX文件和DOC文件互转

Java实现doc文件和docx文件互转的几种方式方式1:利用aspose进行转换Jar包地址:链接:https://pan.baidu.com/s/1pwJ-gwghInoU-_M60ZF_YQ提取码:3eek// 将doc输入流转换为docx输入流private static InputStream convertDocIs2DocxIs(InputStream docInputStream) throws IOException { byte[] docBytes = FileCo

2021-08-26 11:08:36 6732 4

原创 Zookeeper入门学习

Zookeeper入门学习文章目录Zookeeper入门学习Zookeeper工作机制Zookeeper特点Zookeeper数据结构Zookeeper应用场景统一命名服务统一配置管理统一集群管理服务器动态上下线软负载均衡Zookeeper安装及配置参数解读配置参数解读Zookeeper集群安装中遇到的问题Zookeeper选举机制(面试重点)几个概念选举机制——第一次启动选举机制——非第一次启动Zookeeper客户端命令行操作连接显示所有操作命令ZNode节点数据信息查看当前znode中包含的内容查看

2021-08-19 21:48:07 166

原创 SpringBoot启动流程及自动装配

SpringBoot启动流程SpringBoot的启动类我们先来看一下SpringBoot的启动类:@SpringBootApplicationpublic class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringBootDemoApplication.class, args); }}可以看到启动类的关键在于注解

2021-07-08 13:12:22 478

原创 SpringAOP原理

Spring AOP原理@EnableAspectJAutoProxy首先来看 @EnableAspectJAutoProxy 这个注解:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AspectJAutoProxyRegistrar.class)public @interface EnableAspectJAutoProxy { // 使用cglib代理 boolea

2021-07-05 12:49:39 84

原创 Spring基于注解的IOC初始化过程(较长慎入)

Spring中基于注解的IOC容器初始化过程文章目录Spring中基于注解的IOC容器初始化过程入口AnnotationConfigApplicationContext一:初始化之构造方法——this()初始化的第一步二:初始化之——register(componentClasses)总结:三:初始化的关键——refresh()1,准备工作——prepareRefresh()2,获取BeanFactory——obtainFreshBeanFactory()2.1,refreshBeanFactory()2

2021-06-29 17:33:46 258

原创 Spring组件注册、Bean生命周期、自动装配相关知识

Spring组件注册、Bean生命周期、自动装配相关知识组件注册相关文章目录Spring组件注册、Bean生命周期、自动装配相关知识组件注册相关@Configuration@Bean使用FactoryBean注入@ComponentScan@Filter@ComponentScans@Scope@Lazy@Conditional(重要)方法上:类上:@Import@Import的第二种用法——ImportSelector:@Import的第三种用法——ImportBeanDefinitionRegist

2021-06-27 13:33:30 131

原创 基于XML的IOC容器初始化以及循环依赖问题——Spring中的refresh()方法

基于XML的IOC容器初始化以及循环依赖问题——Spring中的refresh()方法文章目录基于XML的IOC容器初始化以及循环依赖问题——Spring中的refresh()方法1,找到入口2,准备工作2.1. 配置Bean资源加载器2.2 设置配置信息3,开始启动4,载入5,配置资源读取器6,处理文件并加载7,读取配置内容**解析文档对象**8,创建 BeanDefinitionDocumentReader 解析资源9,解析Document对象10,开始解析11,加载Bean12,载入property

2021-06-21 22:28:39 582

转载 SpringMVC常见面试题(转)

https://blog.csdn.net/a745233700/article/details/80963758

2021-06-17 09:12:52 92

原创 MySQL面试题

MySQL面试题文章目录MySQL面试题1,常见的存储引擎2,MyISAM和InnoDB的区别?3,InnoDB和MyISAM如何选择?4,B(B-)树和B+树的区别?5,为什么不用Hash索引?为什么不用平衡二叉树索引?6,为什么索引会失效?7,什么是聚簇索引和非聚簇索引?8,InnoDB为什么推荐使用自增ID作为主键?9,什么是索引覆盖和回表?10,MySQL中锁的类型?11,事务的基本特性(ACID)?12,事务的隔离级别?13,ACID靠什么保证?14,什么是当前读和快照读?15,什么是MVCC?

2021-06-15 12:51:04 814 1

原创 JVM垃圾收集

JVM垃圾收集(GC)文章目录JVM垃圾收集(GC)介绍运行时区域Java堆与方法区如何确定对象已经可以回收了?引用计数算法可达性分析算法GC Roots几种引用生存还是死亡?垃圾收集算法标记-清除标记-复制标记-整理分代收集Java内存分配机制年轻代(Young Generation)年轻代的内存分配年老代(Old Generation)永久代(Perm Generation)常见的垃圾收集器SerialParNew(Serial的多线程版本)Parallel ScavengeCMS (Concurre

2021-06-07 21:57:03 98

原创 04-内存泄漏和内存溢出

内存泄漏和内存溢出内存泄漏内存泄漏就是对内存中不再使用的对象,垃圾收集器无法从内存中将它们回收,因此它们会一直存在。这种情况可能会导致内存溢出static字段引起的内存泄漏:大量使用static关键字导致静态变量拥有与整个应用程序相同的生命周期未及时关闭资源:字节流,通道等引用了外部类的内部类:非静态内部类的实例化需要先实例化外部类,默认情况下,内部类的实例隐式包含了外部类的引用,所以在适当情况下应当选用静态内部类重写了finalize()方法:在finalize()方法中重新对该类进行了引用

2021-06-07 20:38:52 70

原创 对象的创建、内存布局

对象的创建、内存布局对象的创建过程当Java虚拟机遇到一个new指令时,会先检查这个指令的参数能否在运行时常量池中定位到一个类的符号引用,并且检查这个符号引用所代表的类有没有被加载、解析、初始化过。如果没有,那么必须先执行相应类的加载过程。在类检查通过后,将为新生对象分配内存。为对象分配内存空间实际上是在堆区划分一块指定大小的内存区域。如果堆区是规整的,那么内部应该是被使用过的内存放在一边,没使用过的放在另一边,中间有一个指针作为分界点的指示器。分配内存时指针往没使用过的内存移动对象大小

2021-06-07 13:14:03 72

原创 Java内存区域:堆、栈、方法区、运行时常量池、直接内存

Java内存区域目录文章目录Java内存区域目录介绍运行时数据区域程序计数器(线程私有)Java虚拟机栈(线程私有)本地方法栈(线程私有)堆方法区运行时常量池直接内存介绍Java虚拟机在执行Java程序的过程中将自己所管理的内存区域划分为不同的数据区域。有的区域随着虚拟机进程的启动而一直存在,有的则是跟随线程的启动和结束而建立和销毁。运行时数据区域Java虚拟机运行时数据区结构:程序计数器(线程私有)当前线程所执行的字节码行号指示器,所占内存很小,如果在执行的是一个Java方法,那么他的值

2021-06-07 12:59:26 515

原创 虚拟机类加载机制及双亲委派模型

虚拟机类加载机制及双亲委派模型类的生命周期加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载(验证、准备、解析三个阶段统称为连接)加载、验证、准备、解析、初始化和卸载这五个阶段的顺序是确定的,而解析则不一定,它在某些情况下也可以在初始化之后再开始。类的加载过程加载在加载阶段,Java虚拟机主要完成以下三件事:通过类的全限定名来获取定义此类的二进制字节流讲这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Class

2021-06-06 18:30:21 98

原创 ConcurrentHashMap

ConcurrentHashMap实现原理及使用为什么要使用ConcurrentHashMap?ConcurrentHashMap是线程安全且高效的HashMap。我们知道HashMap在多线程场景下可能会导致死循环(1.7)。而使用线程安全的HashTable效率又非常低下(全是synchronized方法)。JDK1.6中的ConcurrentHashMap**JDK1.6中ConcurrentHashMap采用了分段锁(segment)的形式,即每一把锁用于锁容器中的一部分数据,那么多线程访问

2021-06-06 17:36:24 293

原创 HashMap源码解析及1.7中的死循环问题

HashMap源码解析及1.7中的死循环问题HashMap是一个以键值对形式存储数据的数据结构,键有且仅可以有一个为null,在1.8之前采用了数组+链表的数据结构,之后是数组+链表+红黑树。HashMap是多线程不安全的,HashTable是多线程安全的,但是HashTable在并发环境下效率较低,因此可以考虑使用ConcurrentHashMap来提高并发能力。JDK1.7中的HashMap由于HashMap在1.7及之前使用头插法,会导致多线程环境下可能造成死循环问题。接下来一起看一下1.7中

2021-06-02 21:19:09 446

原创 15-ThreadLocal

线程本地变量——ThreadLocalThreadLocal,即线程变量,是一个以ThreadLocal对象为键,任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。可以通过set(T)方法来设置一个值,在当前线程下再通过get()方法获取到原先设置的值。ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的,多线程环境下可以有效防止自己的变量被其他线程篡改。Thr

2021-05-31 21:31:01 68

原创 ReentrantReadWriteLock-读写锁

读写锁读写锁的概念之前提到锁,基本都是排他锁(如ReentrantLock)。这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性比一般的排它锁有了很大提升。除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共享的用作缓存数据结构,它大部分时间提供读服务(例如查询和搜索),而写操作占有的时间很

2021-05-28 13:20:06 205

原创 ReentrantLock重入锁解析

ReentrantLock从之前的环节我们了解到,synchronized和ReentrantLock都是可重入锁,但是ReentrantLock不像synchronized那样是隐式的重入锁,而是在调用lock()方法时,不阻塞已经获取到锁的线程。ReentrantLock为我们实现了公平锁和非公平锁,同时支持重入。ReentrantLock的重入性重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题:线程再次获取锁。锁需要去识别获取锁的线程是否为当前

2021-05-26 13:08:40 177

原创 记一次Hive报错——NumberFormatException

笔者遇到一个Hive的报错:NumberFormatException。

2021-05-20 21:14:07 529

原创 抽象队列同步器-AQS

抽象队列同步器——AQS介绍AQS(AbstractQueuedSynchronizer),是用来构建锁或者其他同步组建的基础框架,他使用了一个int成员变量(waitStatus)表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。子类通过继承AQS这个同步器并实现它的抽象方法来管理同步状态,它既可以支持独占式地获取同步状态,也可以支持共享式地获取同步状态,也是ReentrantLock,CountDownLatch等同步工具实现的基础。CLH lock queueAQS其实是一个

2021-05-20 13:13:07 278

原创 volatile关键字解析

Volatile关键字解析volatile是轻量级的synchronized,它在多线程开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程的上下文切换和调度。volatile的定义与实现原理Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通

2021-05-17 13:05:03 78

原创 ArrayList源码解析

ArrayList源码解析ArrayList介绍ArrayList是我们集合框架中最常使用的数据结构之一。它实现了RandomAccess接口,支持快速随机访问。底层基于数组实现容量大小的动态变化,下面是ArrayList的类图:AbstractCollection:该抽象类是Collection接口的一个基本实现,提供了部分操作集合的方法AbstractList是一个抽象类,实现了List接口。提供了一部分操作集合的方法,和get(int index)等抽象方法RandomAcce

2021-05-13 22:08:28 57

原创 synchronized关键字解析

synchronized 关键字实现原理介绍synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现为以下三种形式:对于普通同步方法,锁是当前实例对象:对于静态同步方法,锁是当前类的Class对象对于同步方法块,锁是synchronized括号里配置的对象// 普通的synchronized方法public synchronized String getName() { return "张三";}// 静态同步方法public synchronized

2021-05-13 13:22:43 82

原创 线程与协程

Java中的线程Java线程如何实现以HotSpot为例,它的每一个Java线程都是直接映射到一个操作系统的原生线程来实现的,而且中间没有额外的简介结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提供调度建议),全权交给操作系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间,该把线程安排给哪个核心处理器去执行等,都是由操作系统完成的,也都是由操作系统全权决定的。Java线程调度线程的调度方式有两种:协同式线程调度和抢占式调度。协同式的好处:实现简单,

2021-05-11 12:23:26 82

原创 先行发生原则-Happends-Before

先行发生原则——Happens-Before先行发生原则是判断数据是否存在竞争,线程是否安全的有效手段。先行发生是Java内存模型中定义的两项操作之间的偏序关系,比如说操作A先行发生于操作B,其实就是说发生在B之前,操作A产生的影响能被B观察到,“影响”包括修改了内存中共享变量的值,发送了消息,调用了方法的等。以下举例说明:// 以下操作在线程A中执行i = 1;// 以下操作在线程B中执行j = i;// 以下操作在线程C中执行i = 2;假设线程A中的操作“i=1”先行发生于线程B的操

2021-05-08 08:37:06 717

原创 JMM——Java内存模型

JMM——Java内存模型概述在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的计算能力强大了,还有一个重要的原因是:计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O,网络通信或者数据库访问上。如果不希望处理器在大部分时间都处于等待其他资源的空闲状态,就必须使用一些手段把处理器的运算能力"压榨"出来,否则就会造成很大的性能浪费,而让计算机同时处理几项任务是最容易想到,也最有效的“压榨”手段。**每秒事务处理数(Transactions Per Second,

2021-05-07 12:56:19 125

原创 Unsafe源码解析

Unsafe介绍:​ Java无法直接访问底层操作系统,而是通过本地方法(native)来访问。Java中的Unsafe类为我们提供了管理内存的能力。创建Unsafe对象Unsafe类是final的,不允许继承,而且构造函数是final的,无法通过new的方式创建对象:public final class Unsafe { // 构造函数私有 private Unsafe() {} ...}但是我们可以通过反射的方式获取Unsafe对象:static void t

2021-05-06 13:33:43 403

空空如也

空空如也

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

TA关注的人

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