摘要:
这篇文章主要讲解Spring IOC容器的主要内容:Bean的实例化、初始化。 通过之前跟踪Spring IOC刷新的源码,我们所有的剩余的单例Bean都是通过这一步:finishBeanFactoryInitialization(beanFactory);来进行初始化的。最重要的一个方法就为:De 阅读全文
摘要:
基本概念 主键、外键、超键、候选键 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。 候选键:是最小超键,即没有冗余元素的超键。 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数 阅读全文
摘要:
两种注入方式 第一种注入方式: 第二种注入方式: 结合策略设计模式 策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else。 比如我们生活中的场景:买东西结账可以使用微信支付、支付宝支付或者银行卡支付,这些交易方式就是不同的策 阅读全文
摘要:
我们基本已经形成了常识,需要用到金钱的地方要用BigDecimal而不是其他,而我们也都知道浮点型变量在进行计算的时候会出现丢失精度的问题。 那么,你知道其实BigDecimal也会丢失精度吗? 如下一段代码: System.out.println(0.05 + 0.01); System.out. 阅读全文
摘要:
关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性。本文主要讲解Spring中如何使用策略模式,工厂方法模式以及Builder模式。 策略模式 关于策略模式的使用方式,在Spring中其实比较简单,从本质上讲,策略模式就是一个接口下有多个实现类,而每种实现类会处理某一种情况。 Sp 阅读全文
摘要:
Spring Boot 简介 SpringBoot是一个快速开发框架,通过maven依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化XML配置,内置HTTP服务器(Tomcat,Jetty),最终以Java应用程序进行执行。 三种创建 Spr 阅读全文
![创建SpringBoot项目的3种方式](https://img2023.cnblogs.com/blog/2443180/202310/2443180-20231021145943357-468535800.png)
摘要:
什么是分布式事务 分布式对应的是单体架构,互联网早起单体架构是非常流行的,好像是一个家族企业,大家在一个家里劳作,单体架构如下图: 但是随着业务的复杂度提高,大家族人手不够,此时不得不招人,这样逐渐演变出了分布式服务,互相协作,每个服务负责不同的业务,架构如下图: 因此需要服务与服务之间的远程协作才 阅读全文
摘要:
基础概念简述 逻辑架构 第一层:客户端通过连接服务,将要执行的sql指令传输过来 第二层:服务器解析并优化sql,生成最终的执行计划并执行 第三层:存储引擎,负责数据的储存和提取 锁 数据库通过锁机制来解决并发场景-共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资 阅读全文
摘要:
单一职责原则——SRP 开闭原则——OCP 里式替换原则——LSP 依赖倒置原则——DIP 接口隔离原则——ISP 迪米特原则——LOD 单一职责原则 单一职责原则的定义是就一个类而言,应该仅有一个引起他变化的原因。也就是说一个类应该只负责一件事情(单例模式其实是违背该原则的)。如果一个类负责了方法 阅读全文
摘要:
单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点! 懒汉, 线程安全 在方法上添加synchronized。在多线程下可以很好的工作,也延迟加载了,但是效率很低,99%情况下不需要同步。 饿汉, 线程安全 定义一个static变量,直接创建单例对象,线程安全,无延迟加载。 这种方 阅读全文
摘要:
Java中创建线程主要有三种方式 继承Thread类创建线程类 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。 创建Thread子类的实例,即创建了线程对象。 调用线程对象的start()方法来启动该线程。 Threa 阅读全文
摘要:
线程池的好处 线程池的重用 线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是突飞猛进的提升。 控制线程池的并发数 并发:在某个时间段内,多个程序都处在执行和执行完毕之间;但在一个时间点上只有一个程序在运行。头脑风暴:老 阅读全文
摘要:
新手常犯的错误 可能很多新手(包括当年的我)第一时间想到的写法是下面这样的: public static void main(String[] args) { List<String> platformList = new ArrayList<>(); platformList.add("博客园") 阅读全文
摘要:
知识回顾 线程与进程 一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。 线程类Thread的几个重要方法 start()方法,调用该方法开始执行该线程; join方法,调用该 阅读全文
摘要:
为什么使用线程池 每个请求对应一个线程方法的不足是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。容易引起资源不足,造成浪费。为解决单个任务处理时间很短而请求的数目巨大的问题,引出线程池: 通过 阅读全文
摘要:
volatile的作用 通常情况下我们可以通过Synchronized关键字来解决可见性、有序性及原子性问题,不过synchronized是一个比较重量级的操作(但是jdk1.6以后做了优化),对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用synchronized来解决问题 阅读全文
摘要:
线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。 New:新建状态,当线程创建完成时为新建状态,即new Thread(…),还没有调用start方法时,线程处于新建状态。 R 阅读全文
摘要:
Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。 Synchronized的作用主要有三个: 确保线程互斥的访问同步代码 保证共享变量的修改能够及时可见 有效解决重排序问题 从语法上讲,Synchronized总共有三种用 阅读全文
摘要:
阅读全文
摘要:
对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定! 问题复现 线上系统突然运行缓慢,CPU飙升,甚至到100%,以及Full GC次数过多,接着就是各种报警:例如接口超时报警等。此时急需快速线上排查问题。 问题排查 不管什么问题, 阅读全文