Java学习笔记
文章平均质量分 88
qq_43144487
They say the door will open up as soon as you find the missing key
展开
-
Redis笔记
死锁问题:说的是锁没有被动过期时间,即拿到了锁,但是在执行业务过程中,程序崩溃了,锁没有被正常释放,导致其他线程无法获取到锁,从而产生死锁问题。之前的解决方式:set nx ex命令锁被其他人释放问题:第一条线程抢到锁,业务执行超时,第一条线程所持有的锁被自动释放;此时第二条线程拿到锁,准备执行业务,刚好第一条线程业务执行完成,照常执行了释放锁的过程,导致第二条线程持有的锁被第一条线程所释放,锁被其他人释放。之前的解决方式:给锁一个唯一值(UUID),每次解锁前进行判断原子性操作。原创 2023-06-26 19:16:41 · 1413 阅读 · 0 评论 -
异步 线程池
在 Java 8 中, 新增加了一个包含 50 个方法左右的类: CompletableFuture, 提供了非常强大的Future 的扩展功能, 可以帮助我们简化异步编程的复杂性, 提供了函数式编程的能力, 可以通过回调的方式处理计算结果, 并且提供了转换和组合 CompletableFuture 的方法。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。因为线程池中的线程数没有超过线程池的最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能执行。原创 2023-06-27 19:12:54 · 43 阅读 · 0 评论 -
登录模块笔记
在存入session时jsessionid的作用域提升至最大.比如auth.gulimall.com->.gulimall.com,那么gulimall.com及其下面的所有子域名都可以拿到这个jsessionid,然后再去redis中查询对应的session信息,可以实现不同服务之间的session共享。相同服务之间的session共享使用,session存入redis即可解决问题,相同服务的域名是相同的jsessionid也是相同的。不同服务,Session不能共享,子域Session 共享问题。原创 2023-06-27 21:08:59 · 48 阅读 · 0 评论 -
Spring SpringMVC Mybatis Springboot
Spring 包含了多个功能模块,其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块。AspectJ:本质上是静态代理,将代理逻辑“织入”被代理的目标类编译得到的字节码文件,所以最终效果是动态的。1.从目标对象中,把非核心业务代码(横切关注点)抽离出来(抽离出横切关注点), 并放入切面(就是一个类)中,封装每一个横切关注点为通知(就是封装为一个方法)。这就需要使用动态代理技术了。原创 2023-06-25 18:20:55 · 146 阅读 · 0 评论 -
RabbitMQ
应用场景一:缩短调用时间同步处理:1、注册信息写入数据库;2、发送注册邮件;3、发送注册短信 150S异步处理【需要等待返回】:1、注册信息写入数据库;异步发送: 2、发送注册邮件 + 发送注册短信 100S消息队列【不需要等待返回】:1、注册信息写入数据库;写入队列:异步读取 2、发送注册邮件;3、发送注册短信 50S【因为 发送邮件+发送短信 不需要等待返回】原创 2023-06-28 20:11:16 · 1853 阅读 · 0 评论 -
设计模式GOF
具体地说,就是把所有子类通用的信息和行为抽象出来放在父类中,建立抽象方法或非抽象的通用方法,然后由子类去继承和实现。下面我以[上数学课]和[上英语课]为例,展示模板方法模式的代码实现。原创 2023-06-29 19:34:08 · 417 阅读 · 0 评论 -
Nginx笔记
正向代理是一个位于客户端和原始服务器之间的代理服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器。当请求过多,单个服务器难以负荷时,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将推断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。Nginx反向代理给网关的时候 会丢失请求的host的信息(实际上不止这一个)主要是配置server块。原创 2023-06-26 21:39:34 · 201 阅读 · 0 评论 -
Java创建线程的几种方法
创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象。定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体。定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。创建Thread子类的实例,即创建了线程对象。调用线程对象的start()方法来启动该线程。调用线程对象的start()方法来启动该线程。原创 2023-07-04 20:41:24 · 206 阅读 · 0 评论