- 博客(58)
- 收藏
- 关注
原创 Spring篇--AOP
AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程。
2025-02-15 16:31:54
1091
原创 Spring篇--基于注解的Spring应用
非自定义Bean不能像自定义Bean一样使用@Component进行管理,非自定义Bean要通过工厂的方式进行实例化,使用@Bean标注方法即可,@Bean的属性为beanName,如不指定为当前工厂方法名称//将方法返回值Bean实例以@Bean注解指定的名称存储到Spring容器中如果@Bean工厂方法需要参数的话,则有如下几种注入方式: · 使用@Autowired 根据类型自动进行Bean的匹配,@Autowired可以省略;
2024-12-24 15:29:40
1014
原创 Spring篇--xml方式整合第三方框架
将自定义标签的约束 与 物理约束文件与网络约束名称的约束 以键值对形式存储到一个spring.schemas文件里,该文件存储在类加载路径的 META-INF里,Spring会自动加载到;将自定义命名空间的名称与自定义命名空间的处理器映射关系 以键值对形式存在到一个叫spring.handlers文件里,该文件存储在类加载路径的 META-INF里,Spring会自动加载到;
2024-12-19 12:43:56
1246
原创 Spring篇--bean的生命周期
Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段: · Bean的实例化阶段:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;
2024-12-15 15:46:49
934
原创 Spring核心--Bean后处理器
1.自定义@MyComponent注解,使用在类上//显示的指定Bean的beanName2.在类上使用@MyComponent3.自定义BeanFactoryPostProcessor完成注解解析//指定要扫描的包//调用扫描工具扫描指定包及其子包下的@MyComponent//遍历Map集合,创建BeanDefinition对象进行注册try {});BeanFactoryPostProcessor 在SpringBean的实例化过程中的体现。
2024-12-15 12:45:51
852
原创 Spring篇--SpringBean的配置详情
Spring的自定义标签需要引入外部的命名空间,并为外部的命名空间指定前缀,使用 < 前缀:标签> 形式的标签,称之为自定义标签,自定义标签的解析流程也是 Spring xml扩展点方式之一详细介绍--引入第三方命名空间--> < dubbo: annotation > < mvc: annotation-driven >
2024-11-21 14:19:34
965
原创 Java并发篇--ConcurrentHashMap
ConcurrentHashMap是JUC包下的线程安全的集合工具,它相对于hashtable有了很大的性能提升。不同于hashtable的将对象上锁,ConcurrentHashMap将锁的粒度更高,它是用hash表的每个节点对象做为锁的。
2024-11-19 14:48:53
610
原创 Java并发篇--ReentrantReadWriteLock
当读操作远远高于写操作时,这时候使用读写锁让读-读可以并发,提高性能。类似于数据库中的select … from … lock in share mode提供一个数据容器类内部分别使用读锁保护数据的read()方法,写锁保护数据的write()方法。这里读读操作可以同时执行,读写操作互斥,写写操作也互斥。
2024-11-17 12:39:41
765
原创 Java并发篇--ReentrantLock原理
先从构造器开始看,默认为非公平锁NonfairSync 继承自 AQS没有竞争时第一个竞争出现时Thread-1执行了1.CAS尝试将state由0改为1,结果失败2.进入tryAcquire逻辑,这时state已经是1,结果仍然失败3.接下来进入addWaiter逻辑,构造Node队列 · 图中黄色三角表示该Node的waitStatus状态,其中0为默认正常状态 · Node的创建是懒惰的 · 其中第一个Node称为Dummy(哑元)或哨兵,用来占位,并不关联线程。
2024-11-15 16:34:43
571
原创 Java并发篇--异步模式之工作线程
让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现 就是线程池,也体现了经典设计模式中的享元模式。注意,不同任务类型应该使用不同的线程池,这样能够避免饥饿,并能提升效率。
2024-11-14 11:09:49
371
原创 Java并发篇--线程池
因为CPU核心数量有限,如果每来一个任务就创建一个线程,就会使线程数远远多于CPU核心数,使线程上下文切换过于频繁,会导致系统性能降低。而且每创建一个线程都会占用一定的内存,如果每来一个任务就创建一个线程,内存消耗太大了。
2024-11-13 18:47:36
750
原创 Java并发不可变篇
设计Servlet时为了保证其线程安全,都会有这样的建议,不要为Servlet设置成员变量,这种没有任何成员变量的类是线程安全的(因为成员变量保存的数据也可以称为状态信息,因此没有成员变量就称为无状态。
2024-11-10 13:44:41
187
原创 Java中的享元模式
当需要重用数量有限的同一对象时。通过对相同值的共享,来做到最小化内存的使用。是Gang of Four 23种设计模式之一。
2024-11-10 13:22:44
600
原创 Java并发无锁篇--乐观锁(非阻塞)
Unsafe对象提供了非常底层的,操作内存、线程的方法,Unsafe对象不能直接调用,只能通过反射获得//设置是否可以访问私有成员变量。
2024-11-10 10:51:32
667
原创 Java内存模型
JMM即java memory model,它定义了主存、工作内存抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。JMM体现在以下几个方面· 原子性 - 保证指令不受到线程上下文切换的影响(之前的synchornized原理文章有介绍过)· 可见性 - 保证指令不会受CPU缓存的影响· 有序性 - 保证指令不会受CPU指令并行优化的影响。
2024-11-06 19:50:01
670
原创 volatile原理
volatile的底层实现原理是内存屏障,Memory Barrier(Memory Fence)· 对volatile变量的写指令后会加入写屏障· 对volatile变量的读指令前会加入都屏障。
2024-11-06 18:16:30
280
原创 JUC笔记之ReentrantLock
相对于synchronized它具备如下特点· 可中断· 可以设置超时时间· 可以设置为公平锁· 支持多个条件变量(多个wait set,不同于synchronized的wait set,ReentrantLock的wait set在同一条件下notify才能唤醒WATING状态的线程)与synchronized一样,都支持可重入。
2024-11-05 16:49:50
269
原创 异步模式之生产者/消费者
与前面的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应· 消费队列可以用来平衡生产和消费的线程资源· 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据· 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据· JDK中各种阻塞队列,采用的就是这种模式。
2024-10-31 15:27:02
409
原创 synchronized进阶原理
轻量级锁的使用场景:如果一个对象虽然有多个线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化(如果出现竞争,操作系统会将轻量级锁升级为重量级锁)。轻量级锁对使用者是透明的(由操作系统控制),即语法仍是synchronized。假设有两个方法同步块,利用同一个对象加锁创建锁记录(Lock Record)对象,每个线程的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的Mark Word。
2024-10-29 16:44:16
1010
原创 Java线程中常见方法
用于启动一个新的线程,在新线运行run方法中的代码(start方法只是让线程进入就绪,里边代码不一定立刻执行。并且每个线程对象的start方法只能调用一次,如果调用多次就会出现IllegalThreadStateException)
2024-10-27 12:56:11
978
原创 超卖问题解决方案
超卖问题就是当多个线程并发时,在第一次更改库存之前,其他线程对库存进行了查询得到了未被修改的库存数据,从而进行了后续减库存的操作,导致售卖数量多于库存数量。
2024-10-21 15:47:17
735
原创 Redis实现全局ID生成器
1.当我们使用数据库自增来实现id的生成时,规律过于明显,会给用户暴露很多信息2.当我们订单量过大时无法用数据库的一张表来存放订单,如果两张表的id都是自增的话,id就会出现重复全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具,一般满足以下条件:为了增加ID的安全性,我们不可以直接使用Redis的自增的数值,而是拼接一些别的信息:ID的组成部分:符号位:1bit,永远为0时间戳:31bit,以秒为单位,可以使用69年序号位:32bit,秒内的计数器,支持每秒产生2^32个不同的ID
2024-10-20 15:07:15
298
原创 Redis缓存更新的设计方案
业务场景:低一致性需求: 使用redis内存淘汰机制。例如商铺类型的查询缓存(更改次数非常低的)高一致性需求: 主动更新,并且超时剔除作为兜底方案。例如店铺详情的查询(更改次数较高的数据)
2024-10-18 13:26:34
275
原创 SpringDataRedis快速入门
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。
2024-10-15 18:43:44
543
原创 Redis基础篇(含redis在linux环境下的安装教程,以及用docker安装redis的教程)
SQL是关系形数据库;NoSQL非关系形数据库。
2024-10-14 18:06:55
915
原创 Java数组
数组是一组相同数据类型元素的集合,是一个容器数组本身是引用数据类型,是一个对象数组可以存储基本数据类型也可以存储引用数据类型数组创建必须声明长度,长度不能改变。
2024-07-13 20:31:10
295
原创 Java的基础语法
byte 一个字节short 两个字节int 四个字节long 八个字节(整数默认是int,定义long类型时需要在数的末尾加L或l)//0b开头 表示是二进制//0x开头 表示是十六进制//0开头 表示是八进制。
2024-07-12 21:03:25
1009
原创 Java的搭建
jdk(Java Development Kit Java开发工具包,我们所需安装的)是给java开发人员提供的,里边包含编译工具,打包工具等。还包含jre(Java Runtime Environment Java运行环境)包含的是程序运行时所需要的核心类(库)jre中包含jvm(Java Vir tual Machine Java虚拟机)是java程序最终运行的环境,把.class文件再次翻译成机器码。
2024-07-11 17:49:39
348
1
原创 Java数据结构学习笔记----链表与递归(三)
操作: addHead() addTail() add()学习链表有助于学习后续更复杂的动态数据结构。关键点:找到要待添加位置的前一个结点。注意: 添加完成后,需要更新头节点。toString()【遍历链表】优点:不需要处理固定容量的问题。学习链表有助于更好的学习递归。以链表作为栈的底层数据结构。链表是最简答的动态数据结构。缺点:丧失了随机访问的能力。<3>在链表的尾部添加元素。<1> 链表头添加元素。<2>链表中间添加元素。
2024-05-25 17:25:31
233
原创 Java数据结构学习笔记----栈与队列(二)
如果能够看到元素“2”,那么他后面可见的第一个人就是“2”的Next Greater Element,因为比“2”小的元素都被“2”遮挡住了,第。ArrayDeque是一种基于数组的双端队列实现,它同样实现了Queue接口,并且在尾部添加和移除元素的操作具有较低的时间复杂度。这个问题可以抽象思考:把数组中的元素想象成排队站立的人,元素的大小想象成人的身高。单调栈实际上还是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内元素都保持单调。只能从一端(队尾)添加元素,从另一端(队首)取出元素。
2024-05-24 18:37:22
282
原创 Java数据结构笔记----数组(一)
1、是一门基础学科2、研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据和修改数据3、数据结构可以分为三类:线性结构: 数组、队列、栈、链表、哈希表…树型结构:二叉树、二分搜索树、AVL树,红黑树、堆、Trie、线段树、并查集…图结构:邻接矩阵、邻接表排序算法4、为什么学习数据结构:根据不同的应用,灵活选择最合适的数据结构。
2024-05-23 22:10:22
467
原创 MySQL学习笔记篇--DQL
YEAR(日期列),MONTH(日期列),DAY(日期列) ,HOUR(日期列) ,MINUTE(日期列)ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回。外部的查询语句,称为主查询或。lpad(str,length,填充字符):用指定的字符实现左填充将str填充为指定长度。rpad(str,length,填充字符):用指定的字符实现右填充将str填充为指定长度。str_to_date(字符串格式日期,格式):将日期格式的字符转换成指定格式的日期。
2024-03-07 16:41:29
1002
原创 MySQL学习笔记篇--DML
方式3: INSERT INTO 表名(列1,列2……,列n) VALUES(值1,值2……,值n),(值1,值2。方式1: INSERT INTO 表名(列1,列2。,列n) VALUES(值1,值2。方式4:INSERT INTO 表名(列1,列2。,列n) 查询语句(查询的列数与插入列数匹配)方式2: INSERT INTO 表名 set 列名1=值1,数据操纵语言DML(Data Manipulation Language)常用语句: insert,delete,update。
2024-03-07 16:21:54
174
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人