
程序员
文章平均质量分 89
加班不秃顶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
面试官问:“在项目中用过多线程吗?”你就把这个案例讲给他听!
要说线程,必先说进程。进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。原创 2025-07-04 13:19:32 · 558 阅读 · 0 评论 -
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
首先看看幂等性的概念:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。比如下面这些情况,如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱;订单接口,同一个订单可能会多次创建。原创 2025-07-04 12:55:34 · 546 阅读 · 0 评论 -
Java Review (二十八、集合----- Queue 集合)
之所以说它是比较标准的队列实现 , 而不是绝对标准的队列实现 , 是因为 PriorityQueue 保存队列元的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。Deque 接口提供了 一个典型的实现类: ArrayDeque ,从该名称就可以看出 , 它是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数 , 该参数用于指定 Object[]数组的长度 :如果不指定 numElements 参数, Deque 底层数组的长度为 16。原创 2025-07-03 21:43:01 · 896 阅读 · 0 评论 -
Java Review (二十七、集合----- List 集合)
执行①行代码时 ,程序试图删除一个 A 对象 , List 将会调用该A对象的equals()方法依次与集合元素进行比较,如果该 equalsO方法 以某个集合元素作为参数时返回 true , List将会删除该元素——A 类重写了 equalsO方法 , 该方法总是返回 true。ArrayList 和 Vector 在用法上几乎完全相同 ,Vector十分古老,那时候 Java 还没有提供系统的集合框架,所以 Vector 里提供了 一 些方法名很长的方法。,无须程序保证该集合的同步性。原创 2025-07-03 21:41:32 · 566 阅读 · 0 评论 -
Java Review (八、面向对象----成员变量和局部变量)
从图一中可以看出,当Person 类初始化完成后,系统将在堆内存中为Person类分配一块内存区(当 Person类初始化完成后,系统会为 Person类创建一个类对象),在这块内存区里包含了保存eyeNum类变量的内存,并设 置eyeNum的默认初始值:0。类变量的作用域比实例变量的作用域更大:实例变量随实例的 存在而存在,而类变量则随类的存在而存在。也就是说如果通过一个实例修改了类变量的值,由于这个类变并不属于它,而是属于它对应的类,因此,修改的依然是类的类变量,与通过该类来修改类变量的结果完全相同。原创 2025-06-28 12:00:00 · 720 阅读 · 0 评论 -
Java Review (七、面向对象----方法深入)
方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分, 但从功能上来看,方法完 全类似于传统结构化程序设计里的函数 值得指出的是, Java里的方法不能独立存在 ,所有的方法都必须定义在类里 ,方法在逻辑上要么属于类,要么属于对象。前面己经介绍了 Java 里的方法是不能独立存在的,调用方法也必须使用类或对象作为主调者果声明方法时包含了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时实际传给形参的参数值也被称为实参。swap()方法里的a和b只是main()方法里变量a和b的复制品。原创 2025-06-28 11:00:00 · 1739 阅读 · 0 评论 -
Java Review (五、数组)
在上面的语法格式中,前面的type就是数组元素的数据类型,此处的type必须与定义数组变量时 所使用的type相同,也可以是定义数组时所指定的type的子类,并使用花括号把所有的数组元素括起 来,多个数组元素之间以英文逗号(,)隔开,定义初始化值的花括号紧跟[]之后。Java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存。对于基本类型数组而言,数组元素的值直接存储在对应的数组元素中,因此,初始化数组时,先为 该数组分配内存空间,然后直接将数组元素的值存入对应数组元素中。原创 2025-06-28 09:00:00 · 522 阅读 · 0 评论 -
Java Review (四、流程控制)
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。如果main方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代 码先执行,排在后面的代码后执行。当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直 执行下去,形成死循环。当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。原创 2025-06-28 08:00:00 · 817 阅读 · 0 评论 -
Java Review (二、Java基本数据类型)
类型限制了一个变量能被赋的值,限制了一个表达式可以产生的值,限制了在这 些值上可以进行的操作,并确定了这些操作的含义。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段。至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。Java所有的数值型变量可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型 的变量,则这种方式被称为自动类型转换。原创 2025-06-27 20:24:22 · 723 阅读 · 0 评论 -
设计模式—— 十七:装饰器模式
● 使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接 的方式有所不同,而不是它们的类或者属性值有所不同,大量小对象的产生势必会占用更多 的系统资源,在一定程序上影响程序的性能。每 一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。有一个咖啡店,销售各种各样的咖啡,拿铁,卡布奇洛,蓝山咖啡等,在冲泡前,会询问顾客是否要加糖,加奶,加薄荷等。设计出一个抽象装饰类,它也继承自coffee,具体的装饰类,继承抽象装饰类。原创 2025-06-27 17:30:58 · 806 阅读 · 0 评论 -
设计模式—— 十六 :责任链模式
二是对请求做出回应。对女儿提出的请示,应该在父亲类中做出决定,父亲有责任、有义务处理女儿的请示, 因此Father类应该是知道女儿的请求自己处理,而不是在Client类中进行组装出来,也就是说原本应该是父亲这个类做的事情抛给了其他类进行处理。在实际应用中,一般会有一个封装类对责任模式进行封装,也就是替代Client类,直接返回链中的第一个处理者,具体链的设置不需要高层次模块关系,这样,更简化了高层次模 块的调用,减少模块间的耦合,提高系统的灵活性。OK,业务已经实现了,但是明显这个业务实现是存在问题的。原创 2025-06-27 17:30:25 · 682 阅读 · 0 评论 -
设计模式—— 十五 :命令模式
命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。甲方对乙方做一些要求的时候,要找到对应的组,但是不能希望甲方是非常专业的,可能提需求提到了开发组头上,要求页面变更提到了需求组头上。命令模式的核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送 者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法。场景类中客户找到了需求组,向需求组提出了增加需求和需求变更的要求。原创 2025-06-27 17:29:40 · 555 阅读 · 0 评论 -
设计模式—— 十四 :中介者模式
每个同事类的行为分为两种:一种是同事本身的行为,比如改变对象本身的 状态,处理自己的行为等,这种行为叫做自发行为(Self-Method),与其他的同事类或中介 者没有任何的依赖;迪米特法则认为“每个类只 和朋友类交流”,这个朋友类并非越多越好,朋友类越多,耦合性越大,要想修改一个就得 修改一片,这不是面向对象设计所期望的,况且这还是仅三个模块的情况,属于比较简单的 一个小项目。库房是有容积限制的,不可能无限大,所 以就有了清仓处理,那就要求采购部门停止采购,同时销售部门进行打折销售。原创 2025-06-27 17:29:04 · 830 阅读 · 0 评论 -
设计模式—— 十三 :原型模式
如果原型对象的 成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆 对象的成员变量指向相同的内存地址。原型模式的核心是一个clone方法,通过该方法进行对象的拷贝,Java 提供了一个Cloneable接口来标示这个对象是可拷贝的,Cloneable接口的作用是标记,在JVM中具有这个标记的对象才有可能被拷贝。在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象, 深克隆将原型对象的所有引用对象也复制一份给克隆对象。那么线程安全的问题又来了。原创 2025-06-27 17:27:51 · 577 阅读 · 0 评论 -
设计模式—— 十二 :代理模式
在代理中,调用者只知代理而不用知道真实的角色是谁,屏蔽了真实角色的变更对高层模块的影响,真实的主题角色想怎么修改就怎么修改,对高层次的模块没有任何的影响,只要实现了接口所对应的方法,该模式非常适合对扩展性要求较高的场合。在类图中增加了一个InvocationHandler接口和GamePlayIH类,作用就是产生一个对象的代理对象,其中InvocationHandler是JDK提供的动态代理接口,对被代理类的方法进行代理。强制代理的概念就是要从真实角色查找到代理角色,不允 许直接访问真实角色。原创 2025-06-27 17:27:11 · 556 阅读 · 0 评论 -
设计模式—— 十 一:建造者模式
● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽 象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,完成复杂对象的建造。● 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异 性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的 限制。● 便于控制细节风险 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任 何影响。原创 2025-06-27 17:26:21 · 254 阅读 · 0 评论 -
使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
使用Java Stream操作集合非常便利,但还是容易踩一些坑,比如文中提到的异常和异常,所以使用时要多多注意,能不踩坑就不踩坑,就算踩坑,也别多次踩同一个坑。原创 2025-06-20 17:00:30 · 684 阅读 · 0 评论 -
Redis深入浅出【八】发布与订阅
Redis的事务提供了一种将多个命令打包,然后一次性、有序地执行的机制,它的原理是多个命令会被入队到事务队列中,然后按先进先出(FIFO)的顺序执行,并且事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。原创 2025-06-19 21:37:02 · 990 阅读 · 0 评论 -
深入浅出Redis【七】发布与订阅
SUBSCRIBEPSUBSCRIBE这7个命令的核心都是基于存储在服务器状态的字典和链表实现的。原创 2025-06-19 21:36:00 · 989 阅读 · 0 评论 -
深入浅出Redis【六】设置/移除键的过期时间
是Time To Live的缩写,用来查看某个key的剩余生存时间,单位为秒。类似,也是用来查看某个key的剩余生存时间,但单位为毫秒。类似,也是用来给指定的key设置过期时间,但单位为毫秒。命令用来给指定的key设置过期时间,但指定的是某个时间点。如果key不存在或者key没有设置过期时间,返回0。类似,用来给指定的key设置过期时间,但指定的是点。命令用来给指定的key设置过期时间,单位为秒。如果key没有设置过期时间,返回-1。如果key没有设置过期时间,返回-1。命令用来移除指定key的过期时间。原创 2025-06-19 21:34:29 · 390 阅读 · 0 评论 -
深入浅出Redis【五】Redis的过期键删除策略?
对于Redis服务器来说,内存资源非常宝贵,如果一些过期键一直不被删除,就会造成资源浪费,因此我们需要考虑一个问题:如果一个键过期了,它什么时候会被删除呢?原创 2025-06-18 21:12:04 · 999 阅读 · 0 评论 -
深入浅出Redis【四】Redis的复制机制(主从复制)
还有个原因就是,虽然Redis的性能很好,但单台毕竟还是有瓶颈的,使用主从复制可以实现读写分离,提高Redis的高可用性,即主服务器用来执行写命令,多个从服务器用来执行读命令,类似于数据库的读写分离。,当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。举个具体的例子,从服务器B一直在复制着主服务器A,刚开始都是正常的,主服务器A执行的写命令也都通过命令。原创 2025-06-18 21:11:02 · 872 阅读 · 0 评论 -
深入浅出Redis【三】Redis的持久化机制(RDB、AOF)
为了解决AO文件体积越来越大的问题,Redis提供了AOF文件重写功能,即Redis服务器会创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库数据相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小很多。由上述实现方式可知,RDB持久化记录的是结果,AOF持久化记录的是过程,所以AOF持久化生成的AOF文件会有体积越来越大的问题,Redis提供了AOF重写功能来减小AOF文件体积。原创 2025-06-18 21:09:58 · 821 阅读 · 0 评论 -
深入浅出Redis【二】Redis的5种数据结构及其常用命令
注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种。原创 2025-06-18 21:08:39 · 966 阅读 · 0 评论 -
深入浅出Redis【一】Redis简介及环境安装
什么是Redis呢?Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。它支持诸如字符串、散列、列表、集合、有序集合等数据结构。--Redis官网Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的高性能的key-value数据库。-- 百度百科Redis是一款依据BSD开源协议发行的高性能key-value存储系统,通常被称为数据结构服务器。-- 其它网友。原创 2025-06-18 21:07:41 · 990 阅读 · 0 评论 -
为什么不推荐用JWT保护你的Web应用?
Web 应用中使用 JWT 是让应用变得更复杂了。在 web 应用中,绝大多数情况下,传统的 cookie-session 机制工作得更好。jwt 适合做简单的 restful api 认证,颁发一个固定有效期的 jwt,降低 jwt 暴露的风险,不要对 jwt 做服务端的状态管理,这样才能体现出 jwt 无状态的优势。作者:miffy_fei链接:https://juejin.cn/post/6844903870347345927来源:稀土掘金著作权归作者所有。原创 2025-06-17 20:37:50 · 878 阅读 · 0 评论 -
面试官:聊一下你对MySQL索引实现原理?
在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响。所以,我们要追求两者的一个平衡点,足够多的索引带来查询性能提高,又不因为索引过多导致修改数据等操作时负载过高。InnoDB支持3种常见索引,我们接下来要详细讲解的就是 B+ 树索引,哈希索引,全文索引。原创 2025-06-17 20:35:23 · 761 阅读 · 0 评论 -
面试官:你了解CAS吗?有什么问题吗?如何解决?
CAS全称,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。内部的AQS和原子类内部都使用了CAS。需要读写的内存值V。进行比较的值A。要写入的新值B。只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。在Java中,CAS操作主要通过java.util.concurrent.atomic包中的类来实现。例如,AtomicInteger、AtomicBoolean、AtomicReference等。原创 2025-06-17 20:31:46 · 803 阅读 · 0 评论 -
Java面试官:Synchronized是怎么实现的?
可重入锁是一种特殊的互斥锁,它允许同一个线程在持有锁的情况下再次获取该锁。也就是说,同一个线程可以多次获取同一个可重入锁,而不会发生死锁。在 Java 中,synchronized关键字就是一种可重入锁。当一个线程使用synchronized修饰的方法或代码块时,它会获得该对象的锁。如果该线程在持有锁的情况下再次调用同一个对象的synchronized方法或代码块,那么它会再次获得该对象的锁,而不会等待其他线程释放锁。可重入锁的好处是可以避免死锁的发生。原创 2025-06-17 20:26:58 · 954 阅读 · 0 评论 -
【Spring Boot】Spring Boot Debug调试?
在使用spring-boot:run进行启动的时候,如果设置的断点进不去,要进行以下的设置。原创 2025-06-16 20:53:11 · 164 阅读 · 0 评论 -
【Spring Boot】Spring Boot 集成 Mybatis 实现双数据源?
这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源实现数据库的读写分离。原创 2025-06-16 20:46:21 · 261 阅读 · 0 评论 -
【Redis】一文聊清楚Redis主从复制原理
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点,而对于redis来说,一主两从是比较常见的搭配。主节点(Master)同时对外提供读和写操作从节点(Slave)通过replicate同步的方式,从主节点复制数据,保持自身数据与主节点一致从节点只能对外提供读操作当然,对于读多写少类的操作,为了提升整体读请求的处理能力,可以采用一主多从的方式。原创 2025-06-12 21:03:56 · 946 阅读 · 0 评论 -
【Redis】Redis中的分布式锁(步步为营)!
分布式锁指的是,所有服务中的所有线程都去获取同一把锁,但只有一个线程可以成功的获得锁,其他没有获得锁的线程必须全部等待,直到持有锁的线程释放锁。分布式锁是可以跨越多个实例,多个进程的锁互斥性:任意时刻,只能有一个客户端持有锁锁超时释放:持有锁超时,可以释放,防止死锁可重入性:一个线程获取了锁之后,可以再次对其请求加锁高可用、高性能:加锁和解锁开销要尽可能低,同时保证高可用安全性:锁只能被持有该锁的服务(或应用)释放。容错性:在持有锁的服务崩溃时,锁仍能得到释放,避免死锁。原创 2025-06-04 10:30:00 · 838 阅读 · 0 评论 -
【Redis】万字长文带你深入Redis底层数据结构!
Redis 的键值对中的 key 就是字符串对象,而 value 就是指Redis的数据类型,可以是String,也可以是List、Hash、Set、 Zset 的数据类型。其实是Redis 底层使用了一个保存所有键值对,哈希表的最大好处就是 O(1) 的时间复杂度快速查找到键值对。哈希表其实就是一个数组,数组中的元素叫做哈希桶。cstruct redisServer { //... redisDb *db; //... int dbnum; //默认16个}typedef str原创 2025-06-04 07:30:00 · 1835 阅读 · 0 评论 -
【Redis】Redis中常见的数据类型及其应用场景!
适用于二值状态统计的场景。原创 2025-06-03 13:24:14 · 559 阅读 · 0 评论 -
一文带你了解什么是servlet!
Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应,是基于 Java 技术的 web 组件,该组件由容器托管,用于生成动态内容。他是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。servlet说实在点就是个接口,浏览器发送请求给Tomcat(服务器),若是这个请求正好对应了servlet实现类的请求路径,Tomcat就会使用它来响应浏览器,这也就是request(请求)、response(响应)了。java。原创 2025-06-03 13:21:20 · 474 阅读 · 0 评论 -
《深入理解Mybatis原理》Mybatis中的缓存实现原理!
每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句,如果不采取一些措施的话,每一次查询都会查询一次数据库,而我们在极短的时间内做了完全相同的查询,那么它们的结果极有可能完全相同,由于查询一次数据库的代价很大,这有可能造成很大的资源浪费。转载 2025-06-03 13:20:15 · 729 阅读 · 0 评论 -
《深入理解Mybatis原理》MyBatis事务管理机制 !
对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:使用JDBC的事务管理机制:即利用java.sql.Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等。使用MANAGED的事务管理机制。转载 2025-06-03 13:19:07 · 976 阅读 · 0 评论 -
《深入理解Mybatis原理》MyBatis的sqlSession执行流程!
由于数据库会话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。这里面最重要的一句其实就是最后一句代码,它的作用是用合适的TypeHandler完成参数的设置。在mybatis中,通过MapperProxy动态代理咱们的dao, 也就是说, 当咱们执行自己写的dao里面的方法的时候,其实是对应的mapperProxy在代理。转载 2025-05-30 17:04:14 · 850 阅读 · 0 评论 -
深入理解Mybatis原理》MyBatis配置解析过程!
假如我们系统的开发环境和正式环境所用的数据库不一样(这是肯定的), 那么可以设置两个environment, 两个id分别对应开发环境(dev)和正式环境(final),那么通过配置environments的default属性就能选择对应的environment了, 例如,我将environments的deault属性的值配置为dev, 那么就会选择dev的environment。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。转载 2025-05-30 16:54:08 · 775 阅读 · 0 评论