自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ftp服务器文件下载

ftp服务器目录文件及其子目录下文件下载操作:优化:可先获取所有目录级子目录下的文件,而后遍历用线程池处理提高处理效率下载ftp服务器文件(备注:md5值的计算不要放在outputStream里面的trycatch中间,不然md5值会异常)

2023-12-07 01:05:00 494

原创 Java内存模型(JMM)

Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则和规范,通过这组规范定义了程序中各个变量的访问方式。

2022-12-27 21:08:27 308 3

原创 线程的认识

在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分成多个运行区域,每个独立的小区域单元称为一个线程。一个进程可以同时执行多个任务,每个任务都是一条线程,进程内部的一个独立执行单元,它是位于进程中,负责当前进程中某个具备独立运行资格的空间。注:进程是负责整个程序的运行,而线程是程序中具体的某个独立功能的运行。一个进程要运行,至少需要开启一条线程。指两个或多个事件在同一时刻发生。指两个或多个事件在同一个时间段内发生。

2022-12-27 16:59:06 147

原创 Java抽象类

父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类。使用某个类描述事件的时候,如果这个类中在描述这个事物的某个行为或功能的时候,只知道这个事物有这个行为或功能,但没有办法书写清楚具体的功能体,函数体,这时可以使用抽象函数来表示这个行为或功能,由于类具有抽象d的函数,这个类就会变成抽象类。

2022-12-27 15:15:52 176

原创 Java如何避免死锁

死锁的定义:死锁是指两个或者两个以上的进程在执行的过程中,由于竞争资源而造成的一种阻塞现象,如果没有外力作用,它们都将无法推进下去,此时称系统处于死锁状态,这些永远在互相等待的进程称为死锁进程。

2022-12-27 13:29:54 270

原创 锁的膨胀升级

锁的状态总共有四种,无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级锁,但是锁的升级是单向的,只能从低级升级到高级,不会出现锁降级。从Jdk1.6中默认是开启偏向锁和轻量级锁的,可以通过-XX:-UseBiasedLocking来禁用偏向锁。

2022-12-27 11:25:09 100

原创 Synchronized详解

synchronized是基于JVM内置锁实现的,通过内部对象monitor(监视器锁)实现,基于进入与退出monitor对象实现方法和代码块同步。监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现,它是一个重量级锁性能较低。在1.5之后的版本经过优化,内置锁的并发性能已经基本与lock持平。

2022-12-27 10:40:25 159

原创 Synchronized和ReentrantLock的区别

6、Synchronized锁的是对象,锁信息保存在对象头中,ReentrantLock通过代码中int类型的state标识来标识锁的状态;3、Synchronized会自动加锁与释放锁,ReentrantLock需要主动加锁和释放锁;4、Synchronized的底层是JVM层面,ReentrantLock是API层面的锁;5、Synchronized是非公平锁,ReentrantLock可以选择公平锁和非公平锁;7、Synchronized是不可以响应中断的,ReentrantLock可响应中断;

2022-12-26 21:29:39 231

原创 微服务调用组件Feign

1、Feign是Netflix开发的声明式、模板化的HTTP的客户端,它能帮助我们更加便捷、优雅地调用HTTP API,它也支持多种注解(例如Feign自带的注解)。2、Spring Cloud Openfeign对Feign进行了增强,使其支持Spring MVC 注解,另外整合了Ribbon和Eureka,从而使得Feign的使用更加便捷。

2022-12-17 00:30:17 355

原创 Spring之循环依赖底层源码解析

先创建AService,执行AService的生命周期0、creatingSet,纪录是否开始创建AService对象的动作;1、实例化Aservice--->得到一个对象--->singletonFactories;2、填充BService属性--->去单例池中寻找BService--->Map--->没有则创建BService;3、初始化前、初始化;4、初始化后(AOP);5、放入单例池。

2022-12-13 22:12:17 158

原创 Spring的事务

①:Spring事务是基于代理实现的,某个方法加了@Transcational只有被代理对象调用时,那么注解才会生效,所以如果是被代理对象调用时,那么则会失效;③:当调用代理对象的方法时,会判断该方法上是否加了@Transcational注解;⑥:然后执行当前方法,方法中会执行sql;⑦:执行完当前方法后,如果没有出现异常就直接提交事务,否则回滚。

2022-12-11 23:00:02 170

原创 Spring之底层架构核心概念解析

Beandefinition表示Bean的定义,Spring源码中它是一个接口,Beandefinition中存在很多属性用来描述Bean的特点:class:表示Bean的类型scope:表示Bean的作用域,单例或多例等lazyInit:表示是Bean是否是懒加载initMethodName:表示Bean初始化时要执行的方法destroyMethodName:表示Bea1、声明式定义Bean:,@Bean,@Component(@Service,@Controller)

2022-12-11 00:00:54 120

原创 spring底层核心原理解析

如果有多个有参构造,没有无参构造方法,则会报错,因为Spring不知道该选择哪个有参构造方法,然后会去寻找无参构造方法,但是现在没有无参构造方法,所以会报错。4、如果Spring选择的是有参构造方法,Spring会先用类型(byType)去匹配,如果只匹配到一个就直接拿来用,如果匹配到多个,再根据入参的名字(byName)去找,如果有则也只会找到一个就可以使用,如果找不到则报错。1、如果一个类只有一个构造方法,不管该构造方法是有参还是无参构造方法,Spring都会使用这个构造方法;

2022-12-09 23:59:53 151

原创 浅谈ThreadLocal

1、ThreadLocal是Java中所提供的线程本地缓存机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据;(由于每一条线程均含有各自私有的ThreadLocalMap容器,这些容器互相独立互不影响,因此不会存在线程安全性问题,从而也无需使用同步机制来保证多条线程访问容器的互斥性)2、ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象中都存在一个ThreadLocalMap,Map的key为ThreadLocal对象

2022-12-08 23:51:58 333

原创 HashMap的扩容机制

①:先生成新数组;②:遍历老数组中的每个位置上的链表或红黑树;③:如果是链表,则直接将链表中的每个元素重新计算下标,并添加到新数组中去;④:如果是红黑树,则先遍历红黑树,先计算出红黑树中每个元素对应在新数组中的下标位置;a:统计每个下标位置的元素个数;b:如果该位置下的元素个数超过了8,则生成一个新的红黑树,并将根节点添加到新数组的对应位置;c:如果该位置下的元素个数没有超过8,那么则生成一个链表,并将链表的头节点添加到新数组的对应位置;⑤:所有元素转移完了之后,将新数组赋值给H

2022-12-07 23:47:04 10226

原创 Executor线程池源码详解

isRunning(c)是判断当前线程的生命状态,因为上面的if创建了核心线程,如果上面的if判断不满足,到这里的if线程已经被关闭了,isRunning(c)获取线程生命状态正常,workQueue.offer()意思是把任务放到队列中

2022-12-06 23:13:23 332

原创 Excutor线程池原理详解

1、线程提交任务到线程池,线程池创建核心线程数,直到线程数等于corePoolSize;2、由于线程池中线程数是核心线程数,再提交来的任务不会直接提交到线程池中线程,而是放到队列中,线程池中的线程去队列中获取任务;3、如果阻塞队列满了,则开始创建非核心线程数来执行任务,线程数小于maximumPoolSize;4、如果阻塞队列满了且线程数等于maximumPoolSize,那么需通过handler所指定的策略来处理任务;5、当线程池中数量大于corePoolsize,如果某个非核心线程空闲时

2022-12-05 23:11:37 294

原创 HashMap的put方法

1、根据key通过哈希算法与运算得出数组下标;2、如果数组下标位置元素为空,则将key和value封装成为Entry对象(JDK1.7中是Entry对象,JDK1.8中是Node对象)并放入该位置;3、如果数组下标位置元素不为空,则要分情况讨论 (1):如果是JDK1.7,则先判断是否扩容,如果要扩容就进行扩容,如果不用扩容就生成Entry对象,并使用头插法添加到当前位置的链表中; (2):如果是JDK1.8,则会先判断当前位置上的Node的类

2022-12-04 21:09:58 1712

原创 List集合的定义和原理

1、List集合是有序的;2、List集合中可以有重复元素 (通过元素的equals方法来比较元素是否重复);3、List集合是一个带有索引的集合,可以通过索引来访问集合中的指定元素;特点:元素有放入顺序,元素可重复存储结构:底层采用数组实现的注意:①:数组的时间复杂度:查询时间复杂度是O(1),插入和删除的时间复杂度为O(N)②:add方法默认特性是从末尾插入数据,故ArrayList中的add插入方法的时间复杂度是O(1)。2、LinkedList特点:元素有放入顺序,元素可重复,存储结构:底层采用

2022-12-03 23:01:47 939

原创 数组的时间复杂度

1、数组的查询复杂度为O(1)是常数集,1代表的是一个常量(比如吃个水果要一分钟,两个水果要两分钟,这里的一分钟和两分钟是一样的,指的是一个大概),数组查找公式a[n]=起始地址+(n*字节数),数组都是按照一个固定的基本类型取查找的,所以查询比较快。举例集合起始位置为100,则索引为2的元素则位置为108(int类型的集合,int类型字节为4)

2022-12-02 22:22:09 3461

原创 数组的定义和原理

数组的定义和原理:数组表示的是一串连续的存储空间。数组既可以存储基本数据类型,也可以存储引用数据类型。

2022-12-01 23:53:16 669 2

空空如也

空空如也

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

TA关注的人

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