自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot自动装配源码

});} });} }也就是,解析@Import注解,获取导入的ImportSeletor类,判断是否属于AutoConfigurationImportSelector,获取对应spring.factories文件中标注的自动装配的类。

2023-05-06 10:48:45 117

原创 SpringBoot启动源码解读

SpringBoot启动源码1 架构演变1.1 演变介绍1.2 区别2 SpringBoot的启动流程1.入口程序:2.创建SpringApplication对象2.1 如何加载的初始化器、监听器3 SpringApplication的run方法基本介绍4 创建EventPublishingRunListener并发布应用启动事件5 初始化应用参数6 根据运行监听器和应用参数来准备spring环境6.1 getOrCreateEnvironment6.2 configureEnvironment(envir

2023-04-04 15:24:24 276

原创 并发编程(九)Future、Callable、FutureTask、CompletableFuture、CompletionService

1.Future、Callable、FutureTask1.1 如何获取线程执行的结果Callable:与Runnable相似,只不过带返回值,并且执行call方法可能会抛出异常。@FunctionalInterfacepublic interface Callable<V> { V call() throws Exception;}Future:异步计算的结果,提供了一些方法来检验任务是否完成。两个 get() 方法都是阻塞式的。// 取消任务boolean can

2023-03-22 14:40:51 241 1

原创 分布式事务

1.本地事务ACID的保证A:原子性,C:一致性,I:隔离性,D:持久化原子性:依靠undolog,保证的,失败时成功回滚。隔离性:数据库支持四种隔离级别,读未提交,度已提交,可重复读,串行化。mysql的隔离性是通过,多版本并发控制(MVCC)+ 行锁实现的。多版本并发控制(MVCC)的底层实现:i)记录的三个隐藏字段1.DB_TRX_ID:最近修改的事务id,事务id递增的2.DB_ROLL_PTR:指向当前记录的上一版本。配合undolog3.DB_ROW_ID:数据库的主键,如果没有

2023-03-22 14:39:05 64

原创 RabbitMQ(1)

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。首先RabbitMQ基于AMQP协议开发,所以很多基于AMQP协议的功能RabbitMQ都是支持的,比如SpringCloud中的消息总线bus其次。

2023-03-22 14:38:49 109

原创 并发笔记(八)JUC原子类以及线程池(Executors)

一.原子类JUC中提供了针对一个变量的修改的简单原子操作,提供了原子类,相对于我们自己采用锁的方式实现来说,原子类的性能更好。1.1原子类的底层实现原理理论:volatile+(循环的CAS)CAS大致流程:每次修改的时候都会拿着之前读到的内容当做期望值,和当前值进行比较,如果说两者相等,那么可以将修改后的值进行赋值。分析:首先通过volatile保证可见性,也就是每次修改之后对于其他线程是可见的。但是我又想到之前学的内容,volatile虽然可以保证可见性,但是存在竞态条件,那么肯定这个Com

2021-03-13 09:01:18 109

原创 并发笔记(七)线程安全容器

一.线程安全容器1.List(CopyOnWriteArrayList)CopyOnWriteArrayList内部维护一个数组,成员变量arr指向这个数组,读操作也就是迭代Iterator遍历的就是这个数组,如果在读的时候,同时存在写操作的时候,会将arr复制一份,然后在复制的数组上进行进行元素的添加,执行操作完成操作之后将arr指向新的数组。适用与:读多写很少的场景优点:读无锁,读的效率很高缺点:浪费内存,读写的短暂不一致注意:CopyOnWriteArrayList的迭代器不支持增删改,

2021-03-10 17:39:49 271

原创 并发笔记(六)多线程步调一致,CountDownLatch、CyclicBarrier、Phaser、Exchanger

一.CountDownLatch案例:对账系统的对账功能,用户下单之后生成订单记录,物流会生成派送订单,防止少发或者是多发,定时调度任务,查询未对账的订单和派送订单进行对账,对于存在差异的生成插入差异库中。初始思路:while(存在未对账订单){ // 查询未对账订单 pos = getPOrders(); // 查询派送单 dos = getDOrders(); // 执行对账操作 diff = check(pos, dos); // 差异写入差异库 save(di

2021-03-08 16:56:39 178

原创 并发笔记(五)ReadWriteLock和StampedLock

JUC包中提供丰富的并发工具,不同的锁适用的场景不同,理解彼此之间的区别,适用的场景,这样在实际的场景中才能做出好的选择,写出好的并发程序。一.ReadWriteLock读写锁:1.允许多个线程同时读共享变量;2.只允许一个线程写共享变量;3.如果一个写线程正在执行写操作,此时禁止读线程读共享变量。ReadWriteLock,不支持锁升级操作,支持锁降级,读锁中不没有条件变量,写锁中有条件变量。显而易见与前面的互斥锁(synchronized和ReentrantLock),重要的区别就是读锁允

2021-03-02 14:33:13 333

原创 并发笔记(四)Lock、Condition以及Semaphore

实现管程除了synchronized之外,java SDK 并发包中提供的ReentrantLock通过实现Lock以及Condition接口实现管程模型。其中Lock实现互斥,Condition实现同步。一.Lock实现互斥,原子性可见性

2021-03-01 16:25:22 172

原创 并发笔记(三)线程的生命周期、合理设置线程数量、局部变量的安全性

一.线程的生命周期1.1 java线程6中状态1.NEW (初始化状态)编译语言中的创建线程,此时操作系统中的线程没有对应创建2.RUNNABLE(可运行/运行状态)对应操作系统中的线程被创建,具有CPU使用权3.BLOCK(阻塞状态)4.WAITING(无时限等待状态)5.TIMED_WAITING(有时限等待状态)这三种状态可以统一看成线程休眠状态,就是导致线程休眠状态的原因不同。当线程处于休眠状态,会释放 CPU 使用权,休眠状态的线程永远没有机会获得 CPU 使用权。6.TER

2021-02-28 11:31:47 149

原创 并发笔记(二)MESA管程模型、预防死锁的三个方法、生产者和消费者的阻塞队列实现

如何使用锁在现实生活中,锁和被保护的资源是有这对应的关系的,在管程的模型中,以及我们开发过程中也要注重这个关系,因为在临界区内的资源有可能会很多,可以将锁和资源进行对应划分,使用细粒度锁,这样的好处就是提升性能,但是坏处就是有可能出现死锁?那么如果方案有可能出现死锁,该如何优化…1.临界区域内资源无相互关系例如:账户对象中的两个成员变量,余额和密码,对于这两个资源可以分别申请对应的锁对象进行保护,也可以使用...

2021-02-25 11:18:04 616

原创 并发笔记(一)三大问题源头以及解决方法

1.并发产生的原因 cpu、内存、io,三者速度的差异,为了更好的利用资源,平衡三者的差异。 i)CPU增加**缓存**,平衡与内存的差异 ii)操作系统添**加进程和线程**,进程和线程的切换,均衡与IO的差异 iii)编译程序**优化执行顺序**,更高效的使用缓存2.并发的源头问题a)缓存导致的可见性问题 单核的cpu,不同的线程切换,由于是同一缓存, 所以线程a对共享变量的修改对于线程b来说是可见的。 多核的CPU,使用不同的缓存,所以会存在不可见的问题。 eg:coun

2021-02-23 14:35:35 404 2

原创 基础排序算法的实现,时间复杂度,空间复杂度,是否稳定

1

2020-12-06 21:30:31 107

原创 JDK1.7和1.8,HashMap的put源码流程图分享

主要介绍了,put源码的流程,方便读者自己阅读源码的时候,更方便介绍了1.7hashMap的死循环问题,关于底层的算法(扰动函数)以及泊松分布,本人也不是很明白,感兴趣的小伙伴可以google。本人水平有限,以上流程图仅供参考,个人理解,如有不对,欢迎留言指正,如有收获,小赞一波,谢谢。...

2020-07-16 22:05:28 292

原创 ReentrantLock的lock以及unlock方法的源码分析,以及AQS源码核心内容

没啥子可说的,直接上图:1.AQS的核心是:volatile state(有具体的实现类定义其含义)、Node(双端链表)。设计模式为模板方法(回调函数),CAS操作Node。2.ReentrantLock中的内部类:Sync的类型结构3.lock方法具体执行过程:源码中有许多的细节没有具体的研读,下面的图是以jdk8的源码画出来的,ReentrantLock不同的版本的代码差距还是挺大的,不过方法的核心思想没有变化,版本的迭代是为了更加的高效。不怎么会画图,并不美观,如果老铁有收获,双击666

2020-06-27 22:37:24 135

原创 常用设计模式,以及设计模式应用的场景(二)

四种设计模式

2020-06-10 19:06:58 277

原创 常用设计模式,以及设计模式应用的场景(一)

常用的单例:面试问的单例:两种比较完美的单例:1.采用静态内部类2.采用Enum类创建出的单例

2020-06-09 16:03:14 279

原创 关于坦克大战游戏中的一个小bug(自己做的项目中的问题整理,记录一下)

子弹在超出,Frame后,从容器中删除的时候注意调用删除方法的位置,或者是遍历子弹容器,创建子弹对象的时候,的遍历方式

2020-05-25 18:22:04 604

原创 手撕LRU算法O(1)的时间复杂度(最近最少使用淘汰算法,常用于缓存)

LRU算法O(1)的复杂度实现:如果不是不要求时间复杂度,可以采用链表加时间戳的形式实现O(1)的时间复杂度,单单采用双向链表的数据结构是不够的,虽然删除和添加的时间复杂度为O(1)的,但是我们想要定位到要删除的元素,还是需要从头开始依次遍历才可以,如何O(1)定位到想要的节点,可以采用散列表,所以最终我们采用散列表+双向链表的形式实现。当然如果不要求手撕的话,可以直接使用LinkedHashMap。我这里直接手撕了:public class LRUCache { private int

2020-05-23 23:11:54 509

原创 进程,线程,纤程的概念,以及线程和纤程对于高并发小案例的时间效率对比(小实验)

进程线程纤程测试案例

2020-05-23 21:41:54 219

原创 synchronized锁升级过程,在Hotspot底层实现指令

本片文章主要讲解synchronized的锁升级过程,以及volatile的两个特性的理解线程阻塞的代价:首先需要明白线程阻塞的代价,线程阻塞(挂起)的时候,需要操作系统的接入,在用户态和内核态之间进行切换,用户态切换到内核态的时候,会将线程中的变量和参数传给内核,内核需要记录在切换时的一些寄存器的值,变量。如果是高并发的情况下,且同步代码块执行时间很快的情况之下,这样是很浪费cpu的资源的,因为线程挂起的时间超过同步代码块执行的时间。在jdk1.6之前,直接使用重量级锁(独占式悲观锁)再上诉的情况下

2020-05-20 13:12:14 397 1

原创 关于intelCPU缓存行,以及伪共享问题

首先两个程序,证明cacheLine的存在。public class ThreadTest { static volatile long[] arr = new long[2]; public ThreadTest() { } public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> {

2020-05-19 00:16:36 304

原创 如何优雅计算菲波那切数列,时间复杂度为O(log(n))

首先看leetcode上一道简单的题目:leetcode上的爬楼梯的问题题目大致描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。f(n) = f(n-1)+f(n-2); // f(n)为n节台阶的走法。n节台阶的走法,为n-1和n-2台阶走法之和。这道题解法很多,我这里主要分分享三种,其实第三种,我也是查一些资料才知道能这么解答,今天写这个主要是整理自己的思路,方便以后复习,温故而知新,

2020-05-18 16:00:00 552 1

空空如也

空空如也

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

TA关注的人

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