- 博客(37)
- 收藏
- 关注
原创 MySQL 锁
1、共享锁:读锁2、排他锁:写锁3、意向共享锁:表级锁,在操作行锁时mysql会自动加入意向锁4、意向排他锁:表级锁,在操作行锁时mysql会自动加入意向锁mysql还要间隙锁:出现幻读。
2022-03-02 14:26:49
428
原创 Java反射与泛型
1、Java的反射:在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。2、Java泛型:JDK5以后引入的一个新特性。是指类型参数化。允许在定义类、接口、方法时使用类型形参,当使用时指定具体类型。泛型类、泛型方法、泛型类派生的子类、类型通配符泛型的上限:上界<? extends T> 不能往里存,只能取。泛型的下限:下界<? super T> 可以存,取的时候只能返回O
2021-12-29 19:41:17
441
原创 Java锁
1、synchronized:隐式获取释放锁的方式。 synchronized锁升级:无锁、偏向锁、轻量锁(自旋锁)、重量锁(10次自旋锁后)2、Lock:主动获取和释放锁,具有可操作性、超时获取锁、等多种特性。Lock是一个接口,定义了锁的基本操作。Lock接口的实现基本都是通过聚合了一个同步器的子类来完成现场访问控制。公平锁 / 非公平锁可重入锁 / 不可重入锁独享锁 / 共享锁互斥锁 / 读写锁乐观锁 / 悲观锁分段锁偏向锁 / 轻量级锁 / 重量...
2021-12-28 15:26:23
221
原创 Java内存模型(JMM)
JMM是一个概念:为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范JMM解决并发问题主要采用两种方式:限制处理器优化和使用内存屏障指令重排:编译器优化的重排序、指令级并行的重排序、内存系统的重排序源代码-->编译器优化重排序-->指令级并行重排序-->内存系统重排序-->最终执行的指令序列as-if-serial语义:不管怎么重排序单线程程序的执行结果不能被改变。happens-before语义:
2021-12-27 11:10:31
211
原创 Java设计模式
用抽象去构建框架、用实现去处理细节。设计模式六大原则:1、单一原则2、迪米特原则3、接口隔离原则4、里氏替换原则5、依赖倒置原则6、开闭原则工厂模式:Spring Ioc bean的创建jdk动态代理cglib动态代理...
2021-12-27 09:55:01
49
原创 RabbitMQ
RabbitMQ是消息代理的软件;消息队列就是一个使用队列来通知的组件。RabbitMQ的特点:1、可靠性: RabbitMQ使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等。2、灵活的路由: 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能, RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起, 也可以通过插件机制来实现自己的交换器。3、扩展性: 多个RabbitMQ节点可以组成一个集群,也可以根据实际业务情况动态地.
2021-12-14 18:32:42
1071
原创 TCP3次握手4次挥手
三次握手:服务器与客户端都属于关闭状态,A客户端主动链接,B服务器被动打开链接。第一次握手:A的TCP客户端向B发出连接请求报文段,(同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),此时TCP服务器进程进入SYN-RCVD(同步收到)状态。
2021-12-09 20:53:03
1666
原创 SpringBoot Starters
@SpringBootApplication包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan注解。SpringBoot的自动配置:
2021-12-07 13:35:19
580
原创 SpringBoot
SpringBoot:SpringBoot用来简化Spring应用的初始化搭建以及开发过程 使用特定的方式进行配置(yml文件或者properties文件)。内嵌tomcat无需部署war文件。自动配置Spring添加对应的功能starter自动化配置。总之 - Springboot来简化Spring应用开发,产品及应用。Springboot的优点:1、快速创建独立的运行的Spring项目与主流框架集成。2、使用嵌入式的tomcat,无需打包成war。3、starters自动
2021-12-06 18:43:09
183
原创 Spring事务
Spring支持的事务管理类型:编程式事务:代码中硬编码声明式事务:在配置文件中配置声明式事务又分为2种:1、基于XML的声明式事务2、基于注解的声明式事务Spring事务的5种隔离级别:与数据库一致,多了一个默认隔离级别。与mysql默认的一致。int ISOLATION_DEFAULT = -1; 默认采用数据库的隔离级int ISOLATION_READ_UNCOMMITTED=Connection.TRANSACTION_READ_UNCOMMITTED;i..
2021-12-06 14:58:16
580
原创 Xml配置和注解之间的区别
注解的优点:1、所有信息都在一个文件中2、当类更改了,不用改xml配置文件xml配置的优点:1、POJO及其行为之间更清晰的分离2、更容易找到POJO
2021-12-06 13:57:03
166
原创 Spring中的常见注解
@Componet:用于指示类是组件。@Controller:是一种特定类型的组件,用于MVC应用程序,主要与@RequestMapping注解一起使用。@Repository:用于表示组件用去存储库和存储/检索/搜索数据的操作。我们可以将此注解应用于DAO实现类。@Service:用于指示类是服务层。@ResponseBody:用于将对象作为response。@Autowired:自动注入@Configuration:表示Spring IOC容器可以将类用作bean定义的源。@
2021-12-06 13:52:09
150
原创 Spring bean
Spring bean的生命周期实例化,初始化,使用,销毁1、spring容器根据配置中的bean定义来实例化bean。2、spring使用依赖注入填充所有属性,如bean中所定义的配置。3、如果bean实现了BeanNameAware接口,则工厂通过传递bean的ID来调用setBeanName()。4、如果bean实现BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory().5、如果存在与bean关联的任何BeanPostProcesso
2021-12-06 13:41:15
53
原创 Spring
Spring 是一种轻量级开发框架,提高开发人员的开发效率以及系统的可维护性。Spring框架指的是Spring Framework,它是很多模块的集合,使用这些模块可以方便的协助我们进行开发。Spring框架的好处:1、轻量级:Spring框架最基础的版本大约2MB。2、控制反转(IOC):通过控制反转实现解耦合。对象给出他们的依赖,而不是创建或查找依赖的对象。3、面向切面(AOP):Spring支持面向切面的编程,并将应用程序业务逻辑与系统分离。4、容器:Spring包含并管理对
2021-12-06 11:25:59
60
原创 MySql 中InnoDB支持的四种事务隔离级别名称
数据库中的事务事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有 操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所 有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作 失败,则事务将回滚,该事务所有操作的影响都将取消。ACID四个基本要素1、原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。 2、一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态。 3、隔离性。在事务正确提交之前,不允许
2021-12-05 21:34:58
952
原创 MySQL数据库中索引的工作机制
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树
2021-12-05 21:33:54
424
原创 MySql 常用的索引
MySql 常用的索引(索引是一种特殊的文件,包含着对数据表里所有记录的引用指针)普通索引: 即针对数据库表创建索引 唯一索引: 与普通索引类似,不同的就是:MySQL数据库索引列的值必须唯一,但允许有空值 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引 组合索引(联合索引): 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。...
2021-12-05 21:33:19
618
原创 Redis 与 Memcached的区别
共同点 :都是基于内存的数据库,一般都用来当做缓存使用。都有过期策略。两者的性能都非常高。区别 :Redis 支持更丰富的数据类型(支持更复杂的应用场景)**。Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。Memcached 只支持最简单的 k/v 数据类型。Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memecache 把数据全部存在内存之中。Redis 有灾难恢复机.
2021-12-05 21:32:41
187
原创 Redis的跳表
快速索引,内存占用、对范围查找的支持其中,插入、删除、查找以及迭代输出有序序列这几个操作,红黑树也可以完成,时间复杂度和跳表是一样的。但是,按照区间查找数据这个操作,红黑树的效率没有跳表高。跳表可以在 O(logn)O(logn) 时间复杂度定位区间的起点,然后在原始链表中顺序向后查询就可以了,这样非常高效。此外,相比于红黑树,跳表还具有代码更容易实现、可读性好、不容易出错、更加灵活等优点,因此 Redis 用跳表来实现有序集合。...
2021-12-05 21:32:07
317
原创 redis
AOF(Append Only File):将被执行的写命令写到AOF文件的末尾。 RDB(Redis DataBase):通过创建快照来获取存储在内存里面的数据在某个时间点上的副本。在创建快照之后,用户可以对快照进行备份,可以将快照复制到其他服务器从而创建相同数据的服务器副本。(如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。)AOF文件比RDB更新频率高,优先使用AOF还原。AOF比RDB更安全也更大。RDB性能比AOF好。如果两个都配了优先加载AOF...
2021-12-05 21:31:20
302
原创 Redis的数据淘汰策略和数据过期后的删除策略
Redis的数据淘汰策略volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allkeys-lru(least recently used):当内存
2021-12-05 21:30:44
520
原创 Redis的雪崩、击穿、穿透
Redis 缓存雪崩当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。如何避免?1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期 3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀Redis 缓存击穿对于设置了过期时
2021-12-05 21:29:49
57
原创 String StringBuffer StringBuild
Stringbuffer线程安全的,append方法被synchronized修饰;StringBuild线程不安全;String不可变是因为被final修饰;
2021-12-03 18:20:59
67
原创 MyISAM与InnoDB 的区别
InnoDB支持事务,MyISAM不支持 InnoDB支持外键,而MyISAM不支持 InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
2021-12-03 18:15:23
916
原创 mysql 与 redis怎么做到强一致性
场景一:先删除缓存在修改数据 这种方式在并发量小的时候是没有问题的,如果在高并发量的环境下,删除缓存,还没有完成写库,另一个请求来了,发现缓存为空,从数据库获取数据然后更新缓存,那么这个时候缓存中的数据其实是脏数据。场景二: 先修改数据后删缓存 这种方式,主要是极端情况下,已经完成了数据库写库,但是恰巧线程宕掉了,此时缓存和数据库就没有保持一致性。 解决方案延时双删策略mysql binlog启动Canal客户端获取binlog日志详情信息–> 逻.
2021-12-03 18:13:14
297
原创 synchronized 和 Lock区别
synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。synchronized是托管给JVM执行的Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作(Compare and Swap)比较与替换。lock是java写的控制锁的代码...
2021-12-03 18:12:35
304
原创 ArrayList 与 LinkList的区别
ArrayList是数组 初始10的大小 每次扩容是按照1.5倍来扩容 copyOf进行复制ArrayList线程不安全List<String> list = Collections.synchronizedList(new ArrayList<String>()); 线程安全ArrayList:增删慢、查询快,线程不安全,对元素必须连续存储。LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能 线程也不安全LinkedList:增删快.
2021-12-03 18:10:44
128
原创 HashMap 与 Hashtable的区别
HashMap和HashTable都实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆,实现Map接口。HashMap的父类AbstractMap类。Hashtable的父类Dictionary。Hashtable既不支持Null key也不支持Null value。都会抛空指针。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。Hashtable是线程安全的,它的每个方法中都加入了Synchr
2021-12-03 17:21:34
363
原创 Java GC
1、如何判断对象不可用判断对象不可用有2个算法:引用计数法、可达性分析算法引用计数法:给对象添加一个引用计数器当计数为0是说明对象不在被引用。 优点:操作简单、方便实现。 缺点:无法解决对象相互引用的问题可达性分析算法:当对象到GC ROOTS没有连接,证明对象不可用。但是当对象的finalize()方法被重写重新与GC ROOTS连接那么对象会变成可达对象;若没重写方法就会被回收。一个对象finalize()方法只会被调用一次。2、GC ROOTS有哪些...
2021-12-03 10:29:34
201
原创 Java类的生命周期及创建对象内存分配策略
加载:将class文件加载到内存中连接:分为验证、准备、解析。 验证:文件格式、数据、字节码等验证 准备:正式为类中变量分配内存并赋初始值 解析:将间接引用变成直接引用 如String s = "xx" + "ss"; 解析成 String s = "xxss"初始化:初始化变量、静态代码块等...
2021-12-02 18:51:17
77
原创 Jvm内存分配
堆空间:JVM 所有线程共享的部分,在虚拟机启动的时候就已经创建。所有的对象和数组都在堆上进行分配。这部分空间可通过 GC 进行回收。当申请不到空间时会抛出 OutOfMemoryError(OOM)。本地方法栈:与虚拟机栈相似(OOM)。虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建(OOM)。方法区:主要用于存储类的信息、常量池、方法数据、方法代码等(OOM)。程序计数器:JVM支持多个线程同时运行,每个线程都有自己的程序计数器。...
2021-12-02 17:26:58
662
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人