自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 实现简易计算器

支持加减乘除及括号运算。

2023-10-15 22:08:16 260

原创 谷粒学院SpringSecurity认证流程详解

CSRF攻击依靠的是Cookie中所携带的认证信息,但是在前后端分离的项目中我们的认证信息其实是token,而token并不是存储中Cookie中,并且需要前端代码去把token设置到请求头中才可以,所以CSRF攻击也就不用担心了。:提供核心用户信息。如果在对用户信息,密码验证的过程中抛出异常,此时会判断用户信息是否从缓存中得到,考虑到数据是不实时的,重新通过retrieveUser方法去取出用户信息,再次重复进行检查验证。我们系统中会有许多用户,确认当前是哪个用户正在使用我们系统就是登录认证的最终目的。

2023-03-19 15:11:37 1145 2

转载 SpringBoot整合Swagger

Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过 Swagger 进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger 消除了调用服务时可能会有的猜测。Swagger 的优势。

2023-03-13 14:56:04 490

转载 SpringBoot学习笔记(四)Web开发

由于封装的JSON数据类型不确定,所以在定义统一的JSON结构时,我们需要用到泛型。/*** 若没有数据返回,默认状态码为0,提示信息为:操作成功!*/this.msg = "操作成功!/*** 若没有数据返回,可以人为指定状态码和提示信息*//*** 有数据返回时,状态码为0,默认提示信息为:操作成功!*/this.msg = "操作成功!/*** 有数据返回,状态码为0,人为指定提示信息*/return msg;

2023-03-09 10:56:10 1294

转载 SpringBoot学习笔记(三)整合Logback日志框架

通过日志查看程序的运行过程,运行信息,异常信息等。

2023-03-06 20:25:33 2276

转载 SpringBoot学习笔记(二)配置文件

3、当 application.properties 或 application.yml 文件在 xxx.jar 应用同目录下时,可以省略 --spring.config.location,直接双击运行,它会自动读取当前目录下的配置 application.properties 或 application.yml 文件。2、多个参数时,用空格隔开,如: java -jar xxxxx.jar --server.port=8082 --server.servlet./context-path=/coco。

2023-03-06 16:28:43 985

转载 SpringBoot笔记(一)入门使用

一、为什么用SpringBootSpringBoot优点创建独立Spring应用内嵌web服务器自动starter依赖,简化构建配置自动配置Spring以及第三方功能提供生产级别的监控、健康检查及外部化配置无代码生成、无需编写XMLSpringBoot缺点人称版本帝,迭代快,需要时刻关注变化封装太深,内部原理复杂,不容易精通官网文档架构。

2023-03-06 12:20:44 629

转载 ThreadLocal 详解

如果key使用强引用:业务代码中使用完ThreadLocal ,ThreadLocal Ref被回收了,因为ThreadLocalMap的Entry强引用了threadLocal,造成threadLocal无法被回收,在没有手动删除这个Entry以及CurrentThread依然运行的前提下,始终有强引用链 Thread ref->currentThread->threadLocalMap->entry,Entry就不会被回收(Entry中包括了ThreadLocal实例和value),导致。

2023-02-10 20:28:53 1201

转载 AQS源码分析之ConditionObject

ConditionObject是AQS中定义的内部类,实现了Condition接口,在其内部通过链表来维护等待队列(条件队列)。Contidion必须在lock的同步控制块中使用,调用Condition的signal方法并不代表线程可以马上执行,signal方法的作用是将线程所在的节点从等待队列中移除,然后加入到同步队列中,线程的执行始终都需要根据同步状态(即线程是否占有锁)。每个条件变量都会有两个方法,唤醒和等待。当条件满足时,我们就会通过唤醒方法将条件容器内的线程放入同步队列中;

2023-02-09 19:52:23 509

转载 Java内存模型之JMM

计算机硬件存储体系计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存,到CPU。一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算。因为有这么多级的缓存(cpu和物理主内存的速度不一致的),CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题。

2023-02-06 19:08:28 111

转载 Java线程中断机制

在我们的程序中经常会有一些不达到目的不会退出的线程,例如:我们有一个下载程序线程,该线程在没有下载成功之前是不会退出的,若此时用户觉得下载速度慢,不想下载了,这时就需要用到我们的线程中断机制了,告诉线程,你不要继续执行了,准备好退出吧。当然,线程在不同的状态下遇到中断会产生不同的响应,有点会抛出异常,有的则没有变化,有的则会结束线程。本篇将从以下两个方面来介绍Java中对线程中断机制的具体实现:

2023-02-06 18:23:38 261

转载 AQS原理分析

release()是独占模式下线程释放共享资源的顶层入口。它会释放指定量的资源,如果彻底释放了(即state=0),它会唤醒等待队列里的其他线程来获取资源。如果获取锁的线程在release时异常了,没有unpark队列中的其他结点,这时队列中的其他结点会怎么办?是不是没法再被唤醒了?答案是YES,这时,队列中等待锁的线程将永远处于park状态,无法再被唤醒!!!但是我们再回头想想,获取锁的线程在什么情形下会release抛出异常呢??线程突然死掉了?

2023-02-06 16:35:11 624 1

转载 Unsafe类

Java 和 C++ 语言的一个重要区别就是 Java 中我们无法直接操作一块内存区域,不能像 C++ 中那样可以自己申请内存和释放内存。Java 中的 Unsafe 类为我们提供了类似 C++ 手动管理内存的能力。Unsafe 类,全限定名是 sun.misc.Unsafe,Unsafe 的字面意思是不安全,但是指的不是线程安全方面,而是指这个类比较底层, 操作的都是内存,线程等,不建议编程人员直接使用。Unsafe 类是 final 的,不允许继承。

2023-02-05 18:47:32 457

转载 JUC的基石:CAS + volatile 实现线程通信

AQS,非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),这些 concurrent 包中的基础类都是使用这种模式来实现的,而 concurrent 包中的高层类又是依赖于这些基础类来实现的,理解这种用法对于源码的阅读会有很好的帮助。Java CAS(compare and swap)自旋操作(JUC基石--CAS+volatile实现线程通信) - 忙碌了一整天的L师傅 - 博客园 (cnblogs.com)

2023-02-05 17:04:25 1311

原创 LookSupport 的使用与原理

LockSupport 是一个工具类,提供了基本的线程阻塞和唤醒功能,它是创建锁和其他同步组件的基础工具,内部是使用类实现的。LockSupport 和使用它的线程都会关联一个许可,park 方法表示消耗一个许可,调用 park 方法时,如果许可可用则 park 方法返回,如果没有许可则一直阻塞直到许可可用。unpark 方法表示增加一个许可,多次调用并不会积累许可,因为许可数最大值为 1。

2023-02-03 19:21:59 601

转载 join方法原理

join() 方法是一个同步方法,当主线程调用 t1.join() 方法时,主线程先获得了 t1 对象的锁,join() 方法中调用了 t1 对象的 wait() 方法,使主线程进入了 t1 对象的等待池,等到 t1 线程执行结束,主线程才能继续执行。在 Java 中,Thread 类线程执行完 run() 方法后,一定会自动执行 notifyAll() 方法,因为线程在死亡的时候会释放有的资源和锁,自动调用自身的 notifyAll() 方法。,JDK 中,Future 的实现也是采用的此模式。

2023-02-03 18:49:06 139

原创 线程八锁问题

考察内容:synchronized 锁住的是哪个对象。

2023-02-03 13:57:12 344

原创 LinkedHashSet源码分析

LinkedHashSet的源码只有如下一点,它的功能都是。起到一个支持作用,访问权限为包权限,不对外公开的。内部的这个构造器,该构造函数主要作用是对。,与HashSet不同的是,它构造的是。继承于HashSet。

2023-01-30 12:56:17 147

转载 HashSet源码分析

HashSet底层是基于HashMap实现的,HashSet内部通过使用HashMap的键来存储集合中的元素。HashMap不能存储重复的Key,所以HashSet不能存放重复元素。由于HashMap的key是基于hashCode存储对象的,所以hashSet中存放的对象也是无序的。内部的HashMap的所有值都是PRESENT,PRESENT在实例域的地方直接初始化了,而且不允许改变。HashSet没有提供get方法,但是可以通过Iterator迭代器获取数据。

2023-01-30 12:25:39 350

转载 Java 语法糖详解

语法糖(Syntactic Sugar)也称糖衣语法,是英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。简而言之,语法糖让程序更加简洁,有更高的可读性。前面介绍了 12 种 Java 中常用的语法糖。所谓语法糖就是提供给开发人员便于开发的一种语法而已。但是这种语法只有开发人员认识。要想被执行,需要进行解糖,即转成 JVM 认识的语法。

2022-11-16 16:01:46 933 1

原创 SpringMVC原理学习(三)获取参数名

属性就是,实现运行时获取方法参数的核心。这个属性是 Java 8 的 class 文件新加的,在MethodParameters保存的信息可以通过反射获取。Spring对这俩种都支持,DefaultParameterNameDiscoverer 是上一节用过的参数名的解析器,看它的内部实现。由于学习成本 ASM 高,这里使用 Spring 封装好的工具类,通过本地变量表获取参数名,底层使用 ASM 获取参数名。1)如果编译时添加了 -parameters 可以生成参数表, 反射时就可以拿到参数名。

2022-11-09 14:57:49 586

原创 SpringMVC原理学习(二)参数解析器

初步了解 RequestMappingHandlerAdapter 的调用过程控制器方法被封装为 HandlerMethod准备对象绑定与类型转换准备 ModelAndViewContainer 用来存储中间 Model 结果解析每个参数值解析参数依赖的就是各种参数解析器,它们都有两个重要方法supportsParameter 判断是否支持方法参数resolveArgument 解析方法参数常见参数的解析省略 @RequestParam@Value。

2022-11-09 14:24:31 1605

原创 SpringMVC原理学习(一)RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter

/ 例如经常需要用到请求头中的 token 信息, 用下面注解来标注由哪个参数来获取它@Target(ElementType.PARAMETER) // 注解位置:方法参数上@Retention(RetentionPolicy.RUNTIME) // 注解作用范围:运行期}// 与 @ResponseBody 注解功能类似,不过返回的是 yml 格式的字符串@Target(ElementType.METHOD) // 注解位置:方法上。

2022-11-09 11:08:53 1382

原创 Spring原理学习(八)AOP底层实现

ProxyFactory 是用来创建代理的核心实现,用 AopProxyFactory 选择具体代理实现注意:要区分上面提到的 MethodInterceptor,它与之前 CGLIB 中用的的 MethodInterceptor 是不同的接口底层切点实现是如何匹配的:调用了 aspectj 的匹配方法,比较关键的是它实现了 MethodMatcher 接口,用来执行方法的匹配。aspectj 切点的局限性:只能匹配方法的信息。

2022-11-07 20:00:08 1498

原创 Spring原理学习(七)JDK动态代理与CGLIB代理底层实现

编译器也能修改 class 实现增强编译器增强能突破代理仅能通过方法重写增强的限制:可以对构造方法、静态方法等实现增强为什么有这么麻烦的一套东西呢?避免反射,提高性能,代价是一个代理类配两个 FastClass 类,代理类中还得增加仅调用 super 的一堆方法用编号处理方法对应关系比较省内存,另外,最初获得方法顺序是不确定,这个过程没法固定死与JDK动态代理相比,CGLIB代理类数目相对较少,只有两个类。而JDK动态代理在调用到第十七次后会生成代理类去优化为非反射调用,并且是一个方法对应一个代理类。

2022-11-05 21:13:27 1561 3

原创 Spring原理学习(六)Scope

在当前版本的 Spring 和 Spring Boot 程序中,支持五种 Scopesingleton,容器启动时创建(未设置延迟),容器关闭时销毁prototype,每次使用时创建,不会自动销毁,需要调用 DefaultListableBeanFactory.destroyBean(bean) 销毁request,每次请求用到此 bean 时创建,请求结束时销毁session,每个会话用到此 bean 时创建,会话结束时销毁。

2022-11-03 20:04:18 369

原创 Spring原理学习(五)初始化与销毁

学习目标:Spring 提供了多种初始化和销毁手段它们的执行顺序。

2022-11-03 20:01:49 455

原创 Spring原理学习(四)Aware 接口

Java 配置类包含 BeanFactoryPostProcessor 的情况,因此要创建其中的 BeanFactoryPostProcessor 必须提前创建 Java 配置类,而此时的 BeanPostProcessor 还未准备好,导致 @Autowired 等注解失效。例如下面这个例子:你会发现用 Aware 注入 ApplicationContext 成功,而 @Autowired 注入 ApplicationContext 失败要想生效就得加处理器。配置类MyConfig1。

2022-11-03 19:59:53 4246 1

原创 Spring原理学习(三)BeanFactory后处理器

ComponentScan, @Bean, @Mapper 等注解的解析属于核心容器(即 BeanFactory)的扩展功能这些扩展功能由不同的 BeanFactory 后处理器来完成,其实主要就是补充了一些 bean 定义。

2022-11-03 14:41:45 532

原创 Spring原理学习(二)Bean的生命周期与Bean后处理器

排序器基类,实现了Comparator,排序规则仅支持PriorityOrdered、Ordered,不支持@Order。:继承自OrderComparator,在OrderComparator排序的基础上,增加了对排序类的@Order注解的支持,但是若既实现Ordered接口,又有@Order注解时,则优先从接口实现中获取值。实现原理主要还是覆写了OrderComparator#findOrder,增加了从注解中获取order的方法。Ordered。

2022-11-02 12:04:40 334

原创 Spring原理学习(一)容器接口与容器实现

不会主动调用 BeanFactory 后处理器不会主动添加 Bean 后处理器不会主动初始化单例不会解析beanFactory 还不会解析 ${ } 与 #{ }bean 后处理器会有排序的逻辑学到了什么?常见的 ApplicationContext 容器实现内嵌容器、DispatcherServlet 的创建方法、作用。

2022-11-01 17:14:57 848

原创 LinkedList源码分析

总体来看 LinkedList 的源码并不复杂,基本都是双向链表的基本操作,大家感兴趣的可以看一下。LinkedList源码深度解析以及迭代器机制【一万字】_刘Java的博客-CSDN博客_linkedlist迭代器LinkedList 源码解析 - 掘金 (juejin.cn)LinkedList(JDK1.8)源码解析_ThinkWon的博客-CSDN博客​​​​​​​。

2022-10-30 11:47:24 394

原创 List.toArray()转数组的正确操作方式

编译的时候不出现问题,但是运行时会出现ClassCastException。参考阿里巴巴开发手册。

2022-10-29 17:03:42 396

原创 ArrayList源码分析

观察源码发现,LinkedList寻找指定节点的方式为,靠近末尾结点就从末尾开始找,靠近开头就从开头开始找,这样就可以只遍历一半结点,也就是位置为list的中间时候将会是最费时的。extends E> c):按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。extends E> c) :构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。创建集合的时候指定足够大的容量,这种优化方式只针对特定的场景,如果添加的元素是少量的、未知的,不推荐使用。

2022-10-26 11:19:16 218

原创 HashMap源码分析

只要两个元素的key计算的哈希码值相同就会发生哈希碰撞。jdk8前使用链表解决哈希碰撞。jdk8之后使用链表+红黑树解决哈希碰撞。

2022-10-23 12:25:14 483

原创 ReentrantLock 原理

调用 lock 方法,当为非公平锁时,只要有线程过来就尝试获取锁,如果获取成功AQS的state==0 并且CAS写入成功,将自身设置为独占锁的拥有者state!= 0 但当前独占锁就是自身(表示重入),将state累加;如果获取失败就将自己设置到 AQS 队列的尾部,等待唤醒;

2022-10-18 17:39:59 1863 1

转载 Java线程池源码解析及使用

让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式。例如,海底捞的服务员(线程),轮流处理每位客人的点餐(任务),如果为每位客人都配一名专属的服务员,那么成本就太高了。注意,不同任务类型应该使用不同的线程池,这样能够避免饥饿,并能提升效率。

2022-10-17 11:50:38 469

原创 不可变类的使用和设计

下面的代码在运行时,由于 SimpleDateFormat 不是线程安全的。

2022-10-15 11:32:15 362

转载 CAS 机制

CAS (Compare And Swap,比较与交换) ,底层是 lock cmpxchg 指令(X86 架构),在单核 CPU 和多核 CPU 下都能够保证【比较-交换】的原子性。在多核状态下,某个核执行到带 lock 的指令时,CPU 会让总线锁住,当这个核把此指令执行完毕,再开启总线。这个过程中不会被线程的调度机制所打断,保证了多个线程对内存操作的准确性,是原子的。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。

2022-10-15 10:37:37 1024

转载 volatile 原理

volatile 是 Java 提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。

2022-10-14 10:28:28 1893

空空如也

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

TA关注的人

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