自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JUC之阻塞队列和API

如果队列长度为3,执行四遍blockingQueue.remove(),会抛出异常NoSuchElementException。阻塞队列:先进先出,写入时如果队列满了,就必须阻塞等待。取时,如果队列是空的,必须阻塞等待生产。//IllegalStateException:Queue full抛出异常。用offer()方法,会有boolean返回值,不抛出异常。用poll()方法,会返回null,不抛出异常。什么时候用阻塞队列:线程池,多线程。

2026-09-26 13:24:30 22

原创 JUC之读写锁

ReadWriteLock:

2026-09-26 11:17:28 11

原创 JUC之常用的辅助类

每次有线程调用countDown()数量-1,假设计数器变为0,countDownLatch.await()就会被唤醒,继续执行。//等待计数器归0,然后再向下执行。release():释放,会将当前的信号量释放+1,然后唤醒等待的进程。acquire():获得,假设如果已经满了,等待,等待被释放为止。作用:多个共享资源互斥的使用!并发限流,控制最大的线程数。

2026-09-26 11:05:19 185

原创 JUC之Callable()

Callable接口类似于Runnable,因为它们都是为其实例可能由另一个线程执行的类设计的。然而,A Runnable不返回结果,也不能抛出被检查的异常。//这个get方法可能会产生阻塞。可以有返回值,可以抛出异常,方法不同,run()/call()如何启动Callable()

2026-09-26 10:40:04 168

原创 JUC之集合类不安全

concurrent包下的CopyOnWriteArrayList,CopyOnWrite写入时复制,COW,计算机程序设计领域的一种优化策略。并发下,ArrayList是不安全的,报并发修改异常:ConcurrentModificationException。多线程调用的时候,list,读取的时候,固定的,写入 (覆盖)//add set本质就是map,key是无法重复的。解决方案:Vector,

2026-09-26 09:14:45 34

原创 JUC之锁执行细节

两个静态同步方法,同一个对象/两个对象,被static修饰之后类一加载就有了,所得是同一个class,谁先拿到谁执行。synchorized锁的对象是方法的调用者,两个方法用的是同一个锁,谁先拿到谁执行。标准情况下,多个线程,哪个线程先执行?增加一个普通方法之后,先执行普通方法。

2026-09-17 20:41:59 126

原创 Lock版生产者消费者问题

精准通知和唤醒线程。

2026-09-17 20:14:37 11

原创 JUC之Lock锁

5.synchorized可重入锁,不可以中断的,非公平;lock可重入锁,可以判断锁,非公平(可以自己设置)多个线程操作同一个共享缓冲区,生产者往缓冲区放数据,消费者取数据,用synchorized做互斥,配合。synchronized:是Java的内置锁,用来保证线程安全,同一时间,最多只能由一个线程拿到锁。4.synchorized线程1(获取锁,阻塞)线程2(等待,等待)lock锁就不一定会等待下去。3.synchorized会自动释放锁,lock必须要手动释放锁,如果不释放锁,死锁。

2026-09-16 21:25:37 46

原创 JUC之线程和进程

什么是JUC:java.util.concurrent+java.util.concurrent.atomic+java.util.concurrent.locks。并发:多个任务交替使用同一个cpu核心,宏观上看起来一起再跑,微观上同一时刻只有一个任务在执行,依靠cpu快速切换任务(时间片轮转)实现。线程的几种状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED。多核cpu才能做到。4,关于捕获异常,wait不需要,sleep需要捕获异常。

2026-09-14 20:30:13 222

原创 RabbitMQ知识1

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见,如果以能处理这类峰值为标准而投入资源,这无疑是巨大的资源浪费,使用 MQ 能够使关键组件支撑突发访问压力,不会因为突发流量而崩溃,比如秒杀活动或者促销活动,可以使用 MQ 来控制流量,将请求排队,系统再根据自己的处理能力逐步处理这些请求,使请求是平缓的速度,而不是猛增猛降。,但这里的消息队列,只不过队列中存放的是消息,消息可以非常简单,也可以非常复杂。】(Message queue),消息队列,字面意思来看,

2026-09-12 13:01:01 208

原创 SpringCloud之Nacos

因此Nacos提供了一种同集群优先的负载均衡策略,在这种策略下,Nacos会把不同服务按地区分为不同集群,并在进行服务调用时,优先调用同一集群的服务,例如上海集群中的服务在进行服务调用时,会优先调用上海集群中的服务。在微服务项目中,同一个服务通常会采取集群模式部署到多台主机上,当服务的配置需要修改时,如果一台一台机器去修改,就会显得十分的麻烦,如果有一个统一的组件能够让我们在组件上修改配置,并将修改的配置信息推送到各个相关的服务主机上,那就会高效很多,而配置中心就是这样一个组件。

2026-06-20 23:01:12 191

原创 Redis知识11之分布式锁

在一个分布式的系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制, 避免出现类似于 “线程安全” 的问题。而 Java 的 synchronized 或者 C++ 的 std::mutex,这样的锁都是只能在当前进程中生效,在分布式的这种多个进程多个主机的场景下就无能为力了,此时就需要使用到分布式锁.本质上就是使用一个公共的服务器,来记录加锁状态。

2026-06-17 13:36:38 226

原创 Redis知识10之缓存

缓存(cache)是计算机中的一个经典的概念,在很多场景中都会涉及到。核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便随时读取。举例:我需要去高铁站坐高铁,坐高铁是需要反复刷身份证的(进入高铁站、检票、上车、乘车过程中、出站...)。正常来说,我的身份证是放在行李箱里的(行李箱的存储空间大,足够能装),但是每次刷身份证都需要开一次行李箱找身份证就非常不方便。因此我就可以把身份证先放到口袋里,虽然口袋空间小,但是访问速度比行李箱快很多。

2026-06-05 12:29:34 212

原创 Redis知识9之集群

这里包含了集群的配置信息(该节点的 id,该节点从属于哪个分片,是主节点还是从节点,从属于谁,持有哪些 slots 的位图...)。前面学习的哨兵模式,提高了系统的可用性。A 判定 B 为 PFAIL 之后,会通过 redis 内置的 Gossip 协议和其他节点进行沟通,向其他节点确认 B 的状态(每个节点都会维护一个自己的 “下线列表”,由于视角不同,每个节点的下线列表也不一定相同)。随着业务的发展,现有集群很可能无法容纳日益增长的数据,此时给集群中加入更多新的机器,就可以使存储的空间更大了。

2026-05-26 10:10:07 430

原创 Redis知识8之哨兵

Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模的应用来说,这种方案是无法接受的,于是 Redis 从 2.8 开始提供了 Redis Sentinel(哨兵)加个来解决这个问题。

2026-05-22 14:56:30 346

原创 Redis知识7之主从复制

在分布式系统中为了解决单点问题(某个服务器程序只有一个节点(只搞一个物理服务器来部署这个服务器程序)。可用性不高:如果这个机器挂了意味着服务就中断了;性能 / 支持的并发量比较有限)。通常会把数据复制多个副本部署到其他服务器,满足故障恢复和负载均衡等需求。在分布式 系统中,往往希望有多个服务器来部署 Redis 服务,从而构成一个 Redis 集群,此时就可以让这个集群给整个分布式系统中的其他服务提供更稳定、更高效的数据存储功能。在若干个 Redis 节点中,有的是 “主” 节点,有的是 “从” 节点。

2026-05-19 18:28:03 438

原创 Redis知识6之事务

这个时候其实就容易引起歧义。因此,即使不保证严格的隔离性,至少也要告诉用户,当前的操作可能存在风险。watch 命令就是用来解决上述这个问题的,watch 在该客户端上监控一组具体的 key,看看这个 key 在事务的 multi 和 exec 之间,set key 之后,是否在外部被其他客户端修改了。当开启事务的时候,如果对 watch 的 key 进行修改,就会记录当前 key 的 “版本号”(版本号可以理解成一个整数,每次修改都会使版本变大,服务器来维护每个 key 的版本号情况)

2026-05-14 11:12:49 380

原创 Redis知识5之持久化

MySQL事务特性MySQL的事务具有四大核心特性,这些特性对于保证数据库操作的准确性和可靠性至关重要。​​原子性​​:事务中的所有操作要么全部成功,要么全部失败,不会出现部分操作成功的情况。​​一致性​​:事务执行前后,数据库必须处于一致的状态,数据的完整性得到保证。[+比如,在电商系统中,用户下单后,库存数量应相应减少,订单状态应变为已支付,这些数据的变化必须保持一致。​​持久性(持久化)​​:事务提交后,其结果是永久性的,即使系统崩溃也不会丢失。

2026-05-12 11:26:19 385

原创 Redis知识4

/multiSet 相当于 redis 中的 mset。//multiGet 相当于 redis 中的 mget。6.1 sadd、smembers、srem 和 sismember。5.1 hset、hget、hexists 和 hdel。7.1 zadd、zrange、zrem 和 zcard。//redis 中 setrange。//redis 中 getrange。4.1 lpush 和 lpop 和 lrange。3.2 getrange 和 setrange。3.1 mget 和 mset。

2026-05-09 11:28:13 388

原创 Redis知识3

如果对应的值是负数,则视为减去对应的值。为了解决这个问题,可以使用 Redis 将用户的 Session 信息进行集中管理,如图 2-13 所示,在这种模式下,只要保证 Redis 是高可用和可扩展性的,无论用户被均衡到哪台 Web 服务器上,都集中从Redis 中查询、更新 Session 信息。1)首先 Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。

2026-05-08 09:16:02 328

原创 Redis知识2

前提:这些socket都是不冲突且不繁琐的,不然还是乖乖多创建几个吧。4.redis的核心功能比mysql要更加简单。大部分的时候都是闲置的(对计算机来说)然后就让一个线程管理多个socket。一个线程可以管理多个socket。3.单线程模型不会出现线程冲突。

2026-05-07 09:33:19 476

原创 Redis知识1

与很多键值对数据库不同的是,Redis 中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能提高开发效率。Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis,并且由于 Redis 受到社区和各大公司的广泛认可,所以支持 Redis 的客户端语言也非常多,几乎涵盖了主流的编程语言,例如:C、C++、Java、PHP、Python、NodeJS 等,后续我会对 Redis 的客户端使用做详细说明。

2026-05-07 09:32:08 177

原创 WebSocket

Websocket是一种协议,用于在客户端和服务器之间建立持久的双向通信连接,广泛应用于需要实时数据交换的应用程序,例如在线聊天、实时游戏、股票行情等。是从 HTML5 开始支持的一种网页端和服务端保持长连接的消息推送机制WebSocket 协议 与 HTTP 协议有什么区别呢?HTTP 协议通常使用在 "一问一答" 的应用场景中:客户端向服务器发送一个 HTTP 请求,服务器给客户端返回一个 HTTP 响应上述情况中,服务器属于被动的一方,若客户端不主动发起请求,服务器就无法主动给客户端响应。

2026-05-06 11:54:44 370

原创 @Transactional

7.Propagation.NESTED :如果你没房,就⼀起买房.如果你有房,我们就以房⼦为根据地,做点小⽣意.(如果如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏.如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED )1.Propagation.REQUIRED :需要有房⼦.如果你有房,我们就⼀起住,如果你没房,我们就⼀起买房.(如果当前存在事务,则加⼊该事务.如果当前没有事务,则创建⼀个新的事务)

2026-05-05 19:12:20 222

原创 Spring事务

本篇文章主要内容为以下两个方面对事务进行一个简单的介绍Spring中事务如何实现事务的概念,我相信很多人在数据库的时候已经听过和了解了,所以这里只进行简单的介绍什么是事务?事务是⼀组操作的集合,是⼀个不可分割的操作。事务会把所有的操作作为⼀个整体,⼀起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。为什么需要事务?我们在进行程序开发时,也会有事务的需求.举个例子吧比如转账操作,A向B转账第⼀步:A账⼾-100元.第⼆步:B账⼾+100元.

2026-05-04 14:00:26 244

原创 SpringAOP原理(代理模式)

对上述代码做一个简单的讲解:1.InvocationHandler接是Java动态代理的关键接⼝之⼀,它定义了⼀个单⼀⽅法 invoke() ,用于处理被代理对象的方法调用.通过实现 InvocationHandler 接⼝,可以对被代理对象的方法进⾏功能增强.2.Proxy 类中使⽤频率最高的⽅法是: newProxyInstance() ,这个⽅法主要⽤来⽣成⼀个代理对象。

2026-05-03 17:17:26 826

原创 Spring AOP详解

AOP是Aspect Oriented Programming的简称(又称为面向切⾯编程)什么是面向切面编程呢?切面就是指某⼀类特定问题,所以AOP也可以理解为面向特定方法编程.什么是面向特定方法编程呢?比如在前面文章实现的"登录校验",就是⼀类特定问题.登录校验拦截器,就是对"登录校验"这类问题的统⼀处理.所以,拦截器也是AOP的⼀种应用.AOP是⼀种思想,拦截器是AOP思想的⼀种实现.Spring框架实现了这种思想,提供了拦截器技术的相关接⼝.

2026-05-02 14:00:24 465

原创 java之拦截器和适配器模式

适配器模式,也叫包装器模式.将⼀个类的接⼝,转换成客⼾期望的另⼀个接⼝,适配器让原本接⼝不兼容的类可以合作⽆间.简单来说就是⽬标类不能直接使⽤,通过⼀个新类进⾏包装⼀下,适配调⽤⽅使⽤.把两个不兼容的接⼝通过⼀定的⽅式使之兼容.比如下⾯两个接⼝,本⾝是不兼容的(参数类型不⼀样,参数个数不⼀样等等适配器模式角色Target:⽬标接⼝(可以是抽象类或接⼝),客⼾希望直接⽤的接⼝Adaptee:适配者,但是与Target不兼容。

2026-05-01 07:17:32 443

原创 Mybatis之动态sql

前面我们学习如何使用 Mybatis 框架来操作数据库,可以发现相比于 JDBC 来说,Mybatis 相当的简单,与 JDBC 繁琐的步骤不同,Mybatis 只需要创建一个接口类,然后可以选择使用注解的方式或者XML的方式来实现该接口类中的方法即可,后续Service层的代码只需要调用mapper接口类中的方法即可实现对应的SQL语句的功能。相比于XML的方式,注解的实现可谓是简单易上手,并且可读性也很好,但是XML也有它自己的好处,现在我们就来学习哪种场景下使用XML更好。

2026-04-30 10:05:55 713

原创 Mybatis操作数据库

在MySQL的学习阶段,我们知道了如何使用JDBC去操作,也正是因为学习了JDBC也知道其操作的繁琐,每次的CRUD操作都需要从数据库连接池中去获取数据库连接,然后再编写SQL语句,并绑定对应的参数,接着通过连接执行SQL语句,如果返回值的话还得处理返回值,最后还得释放连接等资源。明明在增删改查阶段只需要修改SQL语句以及对应的参数和处理返回结果即可,但还是存在很多重复性的操作的。

2026-04-29 10:51:56 540

原创 springboot日志

对于子系统角色而言,它本身是不知道有外观角色的存在的,就像上述计算操作,无论是通过机器语言来实现该操作,还是通过图形化界面来操作,本身对于计算这个操作来说,两者都是使用方,即客户端。上述的所有日志都是输出到控制台上的,但是在实际生产环境中,我们需要将日志保存到本地,以便于后续排查与追溯问题。我们可以从上述图中文件的大小来看,其并不是按照文件大小进行严格划分的,当该行的文件已经超过10KB的话,会将该行的所有日志全部存储完之后,再去新开一个文件来存储,而不是说一满10KB的话,就新开一个文件来存储。

2026-04-29 08:31:48 356

原创 SpringBoot文件配置

计算机上有数以千计的配置⽂件,我们使⽤的绝⼤多数软件,⽐如浏览器,微信,Idea, 甚⾄电脑,⼿机,都离不开配置⽂件.我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在我们的计算机上,⽐如C:\Users,C:\Windows⽂件夹,以及各种*.config ,*.xml⽂件。配置⽂件主要是为了解决硬编码带来的问题,把可能会发⽣改变的信息,放在⼀个集中的地⽅,当我们启动某个程序时,应⽤程序从配置⽂件中读取数据,并加载运⾏。并且上述文件名字不能有错,否则配置无效。

2026-04-28 17:15:55 388

原创 依赖注入详解

依赖注入依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.在上⾯程序案例中,我们使⽤了 @Autowired 这个注解,完成了依赖注⼊的操作简单来说,就是把对象取出来放到某个类的属性中.在 ⼀些⽂章中,依赖注⼊也被称之为"对象注⼊","属性装配",具体含义需要结合⽂章的上下⽂来理解。

2026-04-28 09:13:05 384

原创 Spring IOC(2.0)

通过上篇的文章,我们已经知道了和DI的基本操作,接下来我们来系统的学习SpringIoC和DI 的操作.

2026-04-26 08:02:06 482

原创 Spring IOC(1.0)

传统程序开发先设计轮⼦(Tire),然后根据轮⼦的⼤⼩设计底盘(Bottom),接着根据底盘设计⻋⾝(Framework),最 后根据⻋⾝设计好整个汽⻋(Car)。这⾥就出现了⼀个"依赖"关系:汽⻋依赖⻋⾝,⻋⾝依赖底盘,底盘依赖轮⼦最终程序的实现代码如下:问题分析这样的设计看起来没问题,但是可维护性却很低.接下来需求有了变更: 随着对的⻋的需求量越来越⼤,个性化需求也会越来越多,我们需要加⼯多种尺寸的轮胎.

2026-04-25 10:36:06 443

原创 SpringMVC5.0

什么是应用分层?应用分层 是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的职责, 多个层次之间协同提供完整的功能. 根据项目的复杂度, 把项目分成三层, 四层或者更多层.常见的MVC设计模式, 就是应用分层的一种具体体现.应用分层的目的在最开始的时候,为了让项目快速上线,我们通常是不考虑分层的. 但是随着业务越来越复杂,大量的代码混在一起,会出现逻辑不清晰、各模块相互依赖(高耦合)、代码扩展性差、改动一处就牵动全局的问题。

2026-04-24 17:54:52 547

原创 SpringMVC4.0

密码:<input name="password1" type="password" id="password"><br>用户名:<input name="userName1" type="text" id="userName"><br><input type="button" value="登录" onclick="login()">如果作用在类上, 表示该类的所有方法, 返回的都是数据, 如果作用在方法上, 表示该方法返回的是数据。return "<h1>计算结果: "+sum+"</h1>";

2026-04-23 08:06:07 431

原创 SpringMVC3.0

HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾端发送的数据, 响应头,状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容。HttpServletRequest对象代表客⼾端的请求,当客⼾端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信息.拿取Cookie有两种方式。这也是传统的Servlet的做法,也就是Spring底层。

2026-04-22 08:55:10 853

原创 SpringMVC2.0

紧接上文,这篇我们继续讲剩下的HTTp请求。

2026-04-21 06:26:23 643

原创 SpringMVC1.0

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中. 通常被称为Spring MVC什么是ServletServlet 是一种实现动态页面的技术. 准确来讲Servlet是一套 Java Web 开发的规范,或者说是一套Java Web 开发的技术标准. 只有规范并不能做任何事情,必须要有人去实现它. 所谓实现 Servlet 规范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等.

2026-04-20 08:24:31 495

空空如也

空空如也

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

TA关注的人

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