
架构
文章平均质量分 64
Java训练员
把算法刻入骨髓,程序就是我的灵魂
展开
-
23种设计模式JAVA案例
设计模式JAVA案例源码地址:https://gitee.com/yang-kairui/design-pattern设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式分为三种类型,共23种:行为型模式:1、观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。JAVA的JDK和很多框架都用到了观察者模式,最典型的比如说spring mvc中的DispatcherSe原创 2022-03-31 15:28:48 · 1454 阅读 · 0 评论 -
多线程环境下的读写分离思想
一、场景当我们在多线程的环境下操作一个集合,比如 ArrayList或者Hashmap,这些集合默认情况下肯定是线程不安全的,如果说多个线程同时去读和写这些集合就会有线程安全问题。好,问题来了,我们应该怎么让一个集合变成线程安全的呢?二、synchronized 或者lock锁有一个非常简单的办法,对这些集合的访问都加上线程同步的控制,或者说是加锁。这里可以去另一篇文章看一下Synchronized和lock锁的原理简述synchronized和lock锁最简单的做法就是加一个Synchroni原创 2021-10-20 12:55:28 · 1308 阅读 · 0 评论 -
简述synchronized、lock和原子类的原理
一、Synchronizedsynchronized是一个基于jvm的重量级的锁,他可以保证线程的绝对安全,但是也有一些问题:比如它是非公平的,它的性能不高。它的底层原理实际上是在jvm有一个是类似于计数器的东西叫做monitor,它默认情况下是0,但我们加锁的时候就+1变为1,解锁就是-1变为0,由于Synchronized是一个对象锁,所以它只能允许带有对象头的对象来进行加锁解锁操作,当对象进行加锁时会执行指令monitor enter,当解锁时执行monitor exit。除此之外它还有一些特性原创 2021-10-20 11:56:00 · 281 阅读 · 0 评论 -
如何用redis实现分布式锁
redis实现分布式锁,可以采用setnx,给它设置过期时间避免死锁,也可以用lua脚本实现redis分布式锁需要满足五个条件:1.互斥性不能去解锁别人的分布式锁2.容错性可以主从复制配合哨兵模式实现一个高可用,就是当哨兵监控的主库宕机,我们就把一个slaver升级成master3.不能死锁我们可以设置过期时间,当过期时间到了就去删除这个锁4.一致性只有同一个客户端才能执行加锁和解锁5.自动续期当我们的程序还没执行完,但是锁到期了,就会被导致这个锁被别人拿到,为了解决这个问题,我们可以原创 2021-09-10 08:58:50 · 240 阅读 · 0 评论 -
nacos注册中心的注册原理深度解析
注册流程整个注册中心的注册和发现流程主要有三个方面来完成:服务的提供方(以下简称server)、服务的消费者(以下简称client)、注册中心(nacos)。首先我们来探讨server与nacos的交互过程。server需要通过nacos官方的OpenApi提供的接口来发起服务注册请求,随后server会定时向nacos发送心跳信息来进行心跳检测,对于使用者来说这一步可以采用ScheduledExecutorService创建定时任务来完成。nacos会异步的处理注册请求任务和心跳任务。nacos心原创 2021-09-09 14:54:47 · 17046 阅读 · 3 评论 -
Mybatis-Spring源码解析 —— mybatis与Spring是如何整合的?
Mybatis-Spring源码解析 —— mybatis与Spring是如何整合的?1.原生创建mapper的方式String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);原创 2021-07-22 23:16:14 · 185 阅读 · 1 评论 -
模拟代理对象动态注册到spring容器中
模拟代理对象动态注册到spring容器中1、接口2、使用jdk实现动态代理3、创建一个代理类工厂4、把我们的代理对象动态注入到IoC容器中5、写一个congtoller测试效果1、接口创建一个用于测试的接口/** * 用来模拟动态注入的测试接口 * @author YKR * @Describe * @date 2021/7/16 */public interface MyMapper { public String sayHello();}2、使用jdk实现动态代理原创 2021-07-16 18:44:53 · 524 阅读 · 2 评论