自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 阿里P7岗也必会的知识点:synchronized底层实现与锁升级过程

在Java中,synchronized关键字是用来控制线程同步的。就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。那么synchronized具体是怎么做到线程同步的呢?还有锁升级过程的过程是怎样的的?我们来探讨一下。synchronized实现细节1.1 Java代码实现我们先来了看下如果多线程间竞争共享资源,不采取措施会出现什么情况:public class TestSync implements Runnable { private int coun.

2021-10-13 15:49:02 246

原创 彻底理解ReentrantLock

1. ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。那么,要想完完全全的弄懂ReentrantLock的话.

2021-10-12 16:57:37 242

原创 面试常问的设计模式之单例模式,深入理解单例模式

前言初遇设计模式在上个寒假,当时把每个设计模式过了一遍,对设计模式有了一个最初级的了解。这个学期借了几本设计模式的书籍看,听了老师的设计模式课,对设计模式算是有个更进一步的认识。后面可能会不定期更新一下自己对于设计模式的理解。每个设计模式看似很简单,实则想要在一个完整的系统中应用还是非常非常难的。然后我的水品也非常非常有限,代码量也不是很多,只能通过阅读书籍、思考别人的编码经验以及结合自己的编码过程中遇到的问题来总结。怎么用->怎么用才好->怎么与其他模式结合使用,我想这是每个开发人员都.

2021-10-12 16:34:46 295

原创 P7岗必备基础知识点,Android移动开发WebView常见的问题和解决方案

WebView常见的一些坑1、内存泄漏由于WebView是依附于Activity的,Activity的生命周期和WebView启动的线程的生命周期是不一致的,这会导致WebView一直持有对这个Activity的引用而无法释放,解决方案如下三种:(1)独立进程,简单暴力,不过可能涉及到进程间通信。使webview产生了oom崩溃等问题也不会影响到主程序。方法:在androidmanifest.xml的activity标签里加上android:process="packagename.web"就可.

2021-10-11 21:26:26 380

原创 阿里面试回顾:Java四大引用是什么,它们的区别是什么?

我们都知道 JVM 垃圾回收中,GC判断堆中的对象实例或数据是不是垃圾的方法有引用计数法和可达性算法两种。无论是通过引用计数算法判断对象的引用数量,还是通过根搜索算法判断对象的引用链是否可达,判定对象是否存活都与“引用”有关。引用先说说引用,Java中的引用,类似 C 语言中的指针。初学 Java时,我们就知道 Java 数据类型分两大类,基本类型和引用类型。基本类型:编程语言中内置的最小粒度的数据类型。它包括四大类八种类型:4种整数类型:byte、short、int、long2种浮点数类

2021-10-11 16:21:29 151

原创 kotlin中data class 与object实现单例原理讲解

data class 与 object 关键字原理讲解我们日常开发中肯定离不开javaBean类的,一般来讲,都需要定义里面属性,并且有可能还需要实现hashCode和equals函数。比如下面这个例子。class Human { private String name; private int age; private int sex; public String getName() { return name; } public v

2021-10-09 19:50:38 777

原创 Hash冲突的四大解决办法,Hashmap如何解决hash碰撞问题?

1.链地址法这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。2.再哈希法就是同时构造多个不同的哈希函数:Hi = RHi(key) i= 1,2,3 … k;当H1 = RH1(key) 发生冲突时,再用H2 = RH2(key) 进行计算,直到冲突不再产生,这种方法不易产生聚集,但是增加了计算时间。3.建立公共溢出区将哈希表分为公共表.

2021-10-09 16:53:05 2824

原创 面试必会的知识点:Kotlin 线程同步的 N 种方法,学会了才能不慌

面试的时候经常会被问及多线程同步的问题,例如:“ 现有 Task1、Task2 等多个并行任务,如何等待全部执行完成后,执行 Task3。”在 Kotlin 中我们有多种实现方式,本文将所有这些方式做了整理,建议收藏。Thread.joinSynchronizedReentrantLockBlockingQueueCountDownLatchCyclicBarrierCASFutureCompletableFutureRxjavaCoroutineFlow我们先定义三个T

2021-10-08 15:07:27 416

原创 全面总结Android面试知识点,学会大厂面试题,为金九银十跳槽保驾护航

Android中大厂面试都很重视基础知识的考察,面试前不仅要熟悉这些知识点,也要适当去背诵,保证面对面试官时能从容清晰地表述出来。强烈推荐《Android开发艺术探索》,校招社招都对我很有帮助;《Java并发编程实战》帮助理解多线程安全;《深入理解Java虚拟机》帮助理解JVM。理解了以下问题后,最好要用笔手写下来,帮助你组织语言,加深印象,帮助复习。常规面试题Android面试题ListView 如何缓存的?RecyclerView联系人列表如何实现A-Z快速定位广播和EventBus的区别

2021-10-06 21:54:49 149

原创 分析Binder线程池的启动流程

BinderBinder它是android中的一种进程间通信机制,它主要采用的是CS架构模式。Binder框架中主要涉及到4个角色Client、Server、Service Manager及Binder驱动,其中Client、Server、Service Manager运行在用户空间,Binder驱动运行在内核空间。线程池线程池它是一种用于多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多.

2021-10-06 20:21:33 209

原创 Android整理需要翻译的strings资源,需要把没翻译的中文整理出来翻译成俄文?

问题描述项目需要做俄语国际化,历史代码里有的字段有俄语翻译、有的没有,需要把没翻译的中文整理出来翻译成俄文。大概思路列出所有res目录,根据是否包含values-ru分成两组(半自动在“不包含”分组里把需要翻译的中文文件复制出来(半自动)在“包含”组里把需要补充翻译的字段复制出来(纯手动)把复制出来需要翻译的xml文件转换成excel用于翻译(自动)把翻译好的文件根据转换成xml,根据之前记录的res目录放到项目里(半自动)代码列出所有string.xml文件路径public sta

2021-10-06 16:12:56 226

原创 面试都会问的Android开发之设计模式,聊聊设计模式6大原则

单一职责对于一个类来说,应该只有一个原因引起它的变化,也就是他所承担的职责应该单一化,不应该承担不同的责任。一个类承担的职责越多说明耦合性越高,越不容易被复用。比如我们常用的用户管理类,里面包含了登录,登出等行为。而在登录登出行为中,一个要将用户信息写入到缓存,一个要从缓存中清楚用户信息。那么根据单一职责,显然这里写入以及读取缓存具体的方法实现是不该属于此类的,UserManager类只关心登录登出即可,缓存要交给另外的类实现。代码类似如下:public class UserManager {

2021-09-30 20:16:25 152

原创 如何学习kotlin?Kotlin基础知识快速入门

一 概述Android 1.5系统中Google 引入了NDK功能,支持使用C和C++语言来进行一些本地化开发。17年官宣kotlin为安卓一级开发语言;所以对于安卓开发者,学习kotlin是必须的,这是java最好的第三方库(富语法糖java)。kotlin将代码编译成同样规格的class文件让Java虚拟机识别,它继承了Java的全部财富,和Java100%兼容的,可以直接调用使用Java编写的代码,也可以无缝使用Java第三方的开源库;Kotlin的类型推断也在Java 8 中被推出,Lamb

2021-09-30 17:31:22 1297

原创 鸿蒙开发的圆角该怎么做?没有glide,也只需三分钟

前言看过鸿蒙2.0系统的发布会,大家是不是蠢蠢欲动,想要开发第一个鸿蒙的程序呢,网上有很多文章介绍鸿蒙系统、跟Android的区别以及怎么写HelloWorld的文章,这边就不复制粘贴了。今天换个花样,来看下如何实现Android里面一些常见功能与效果,因为鸿蒙刚出来不久,一切都还不是很成熟(没有前辈的神器),只能靠自己手x代码,废话不多说,来看下鸿蒙系统里如何实现基本的图片圆角功能吧。如今大部分美术在设计样式的时候,都会给图片带上圆角,在鸿蒙开发过程中,一定会遇到要对图片进行二次处理,添加上圆角、

2021-09-30 15:50:46 642

原创 没有网络(开飞行模式)也提示下载成功?Flutter cached_network_image 图片加载流程分析

前言为什么没有网络(开飞行模式)也弹Toast提示下载成功?下意识反应,肯定是Toast提示弹早了,刚点击按钮,还没开始下载就弹了Toast,赶紧拿手机过来操作验证一波。确实没有网络,弹了下载完成提示,去相册检查一下,嗯?图片下载成功了,还有这种操作?赶紧检查一下代码,发现项目中使用的cached_network_image三方库加载的图片,从名字上可以判断,这是一个缓存网络图片的加载框架。所以应该是图片显示出来以后就被缓存到本地了,实际下载的流程并未走网络请求,为了验证想法,看了下框架加载图片流程,

2021-09-29 21:56:36 646

转载 Android 面试总结,那些很可能会被问倒的问题,你都了解吗

Android启动启动模式standard 标准模式singleTop 栈顶复用模式 (例如:推送点击消息界面)singleTask 栈内复用模式 (例如:首页)singleInstance 单例模式 (单独位于一个任务栈中,例如:拨打电话界面)App启动流程在Android 层 第一步就是 fork Zygote 进程(1. 创建服务端Socket,为后续创建进程通信做准备 2. 加载虚拟机 3.fork了System Server进程,负责启动和管理Java Framework层

2021-09-29 16:57:01 200 1

转载 Android刘海屏如何适配?一份详细的Android刘海屏、水滴屏全面屏适配方案

市面上的屏幕尺寸和全面屏方案五花八门。上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖。为便于说明,后文提到的「刘海屏」「刘海区」都同时指代上图两种屏幕。当我们在谈屏幕适配时,我们在谈什么1.适应更长的屏幕2.防止内容被刘海遮挡其中第一点是所有应用都需要适配的,对应下文的声明最大长宽比而第二点,如果应用本身不需要全屏显示或使用沉浸式状态栏,是不需要适配的。针对需要适配第二点的应用,需要获取刘海的位置和宽高,然后将显示内容避开即可。声明最大长宽比以前的普通

2021-09-29 14:48:22 2131

转载 超详细!如何高效学习Android动画?这是一份详细 & 清晰的学习指南

如何高效学习Android动画?当然要有一份指南才能高效学习啦,这就是一份详细并且清晰的学习指南,请拿好收藏哦!前言动画的使用 是 Android 开发中常用的知识可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策本文将献上一份Android动画的全面介绍攻略,包括动画的种类、使用、原理等,能让你更好地掌握动画 从而实现更加复杂的动画效果目录动画类型Android动画分为两大类:视图动画 & 属性动画,具体如下:其中,视图

2021-09-28 20:26:18 162

原创 Java多线程与并发编程 | 同步容器与&Atomic包&CAS算法

前言在多线程环境下我们日常使用的很多类都存在线程安全问题,比如ArrayList、HashSet、HashMap,那么多线程环境下我们应该如何处理好线程问题?CAS算法是什么?除了synchronized有没有别的方法实现线程安全?乐观锁?悲观锁?同步容器JUC工具包中针对这些日常开发中经常使用的集合类,给我们提供了线程安全的类来代替这些类。ArrayList --> CopyOnWriteArrayList -- 写复制列表 HashSet --> CopyOnWrit

2021-08-27 14:23:44 145

原创 【Redis 系列】redis 学习,Redis 集群搭建和主从复制

主从复制的理论先来说说什么是主从复制主从复制,就是将一台 redis 服务器的数据,复制到其他的 redis 服务器上, 前者为主节点 master,后者为从节点 slave数据的复制是单向的,只能是主机复制到从机,master 以写为主,slave 以读为主默认的情况下,每台 redis 服务器都是主节点,并且一个主节点都会有多个从节点或者没有从节点,但是反过来,一个从节点,只能有一个主节点主从复制的作用:数据冗余主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式故障

2021-08-26 13:45:04 104

原创 java多线程之synchronized锁的实现原理

java中synchronized是由JVM层实现的锁,而Lock的实现完全是由JAVA层实现,jdk 1.5之前synchronized是重量级锁实现,效率比较低,经过JVM·的优化,jdk1.5版本及后synchronbized的锁效率已经和Lock差不多。synchronized是通过monitorEnter和monitorExit的JVM指令实现的,下面通过一个简单demo展示下public static void main(String[] args) { synchroni

2021-08-25 14:33:37 166

原创 SpringBoot参数校验最佳实践

我们这里使用hibernate-validator作为对象参数验证器,所以在正式介绍SpringBoot参数验证之前,需要先简单了解一下hibernate-validator的使用。hibernate-validator基本使用引入依赖<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId>.

2021-08-24 14:07:09 386 3

原创 JVM基础——运行时数据区

程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,称之为“线程私有”的内存。程序计数器内存区域是虚拟机中唯一没有规定OutOfMemoryError情况的区域。如果执行Nat..

2021-08-23 14:15:20 75 2

原创 面试官:说说Redis中Hash数据类型的底层结构

前言本文将介绍Redis中Hash数据结构的底层结构,字典。概述字典,又称为符号表、关联数组或映射,是一种用于保存键值对的抽象数据结构。在字典中,一个键(key )可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。字典经常作为一种数据结构内置在很多高级编程语言里面,但Redis所使用的C语言并没有内置这种数据结构,因此 Redis构建了自己的字典实现。字典在Redis中的应用相当广泛,比如 Redis的数据库就是使用字典来作为底层实现的,对数据库的增

2021-08-20 14:03:59 722

原创 深入理解jvm - 类加载过程

前言​ 在最早的文章中,我们虽然讨论过了类加载器的过程,但是并没有讲述内部的细节,本文将会根据类加载器的过程,详细说一下整个类加载的过程中每一个步骤都干什么事情。​ 类加载的过程如下:加载,验证,准备,初始化,解析,使用,卸载。重点需要关注的步骤是前面的五个步骤,这些细节算是八股文的内容,所以这篇文章以简单的总结和归纳为主。概述​ 本篇主要讲述类加载的加载过程,在类加载的过程当中包含了前五个步骤和详细的细节。类加载的过程​ 下们拆分这五个步骤,讲讲每一个步骤都做了哪些事情:加

2021-08-19 13:57:55 135 6

原创 JVM 常见垃圾收集器介绍

垃圾收集器如何演化的?垃圾收集器的发展路线,简单来说是随着内存越来越大而发生变化。从分代算法逐渐演化为不分代算法。从serial的几十兆,逐渐演化到parallel的几个G,再到CMS的几十个G,也从此开始了并发回收。年轻代收集器Serial特点:年轻代、串行回收、STW、简单高效Serial(串行)收集器是最基本、发展历史最悠久的收集器,它是采用复制算法的新生代收集器,曾经(JDK 1.3.1之前)是虚拟机新生代收集的唯一选择。在垃圾回收时,必须暂停其他所有线程的工作线..

2021-08-18 14:05:25 215 2

原创 Java并发编程——阻塞队列BlockingQueue

前言什么是阻塞队列?有那7种阻塞队列?为什么需要阻塞队列?通过剖析JDK 1.8 源码了解源码设计的精髓和巧妙的地方,并运用在我们实际的项目中,他山之石,可以攻玉。1. 什么是阻塞队列感觉并发编程上面的解释不是很容易理解,我们看下源码Doug Lea大佬的注释,意思是阻塞队列支持检索的时候可以等待队列变成非空(也就是阻塞等待), 存储元素的时候,等待空间可用。BlockingQueue方法有四种形式,具有不同的处理操作的方法,这些操作不能立即得到满足,但可能在将来的某个时候得到满足:抛

2021-08-17 15:31:46 216 2

原创 跟我一起来学习Redis中的时间事件

时间事件简介  Redis的时间事件分为以下两类:定时事件:让一段程序在指定的时间之后执行一次。 周期性事件:让一段程序每隔指定时间就执行一次。一个时间事件主要由以下三个属性组成:1、id: 服务器为时间事件创建的全局唯一ID(标识号)。ID号按从小到大的顺序递增,新事件的ID号比旧事件的ID号要大。2、when: 毫秒精度的UNIX时间戳,记录了时间事件的到达(arrive)时间。3、timeProc: 时间事件处理器,一个函数。当时间到达时,服务器就会调用相应的处理器来处理事件。

2021-08-16 14:53:56 699 3

原创 Redis架构实战:高并发情况下并发扣减库存

相信大家从网上学习项目大部分人第一个项目都是电商,生活中时时刻刻也会用到电商APP,例如淘宝,京东等。做技术的人都知道,电商的业务逻辑简单,但是大部分电商都会涉及到高并发高可用,对并发和对数据的处理要求是很高的。这里我今天就讲一下高并发情况下是如何扣减库存的?我们对扣减库存所需要关注的技术点如下:当前剩余的数量大于等于当前需要扣减的数量,不允许超卖 对于同一个数据的数量存在用户并发扣减,需要保证并发的一致性 需要保证可用性和性能,性能至少是秒级 一次的扣减包含多个目标数量 当次扣减有多个数量

2021-08-13 14:40:08 1910 2

原创 SpringBoot面试杀手锏——自动配置原理

引言不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集

2021-08-11 14:50:06 130 2

原创 SpringBoot统一接口返回和全局异常处理,大佬们怎么玩

现在大多数公司项目框架,基本都是属于前后端分离模式,这种模式会涉及到一个前后端对接问题,无论是对前端或者是后台服务,维护一套完善且规范的接口是非常有必要的,这样不仅能够提高对接效率,也可以让我的代码看起来更加简洁优雅。修改前后最大的区别是我们不用在每个接口单独捕获异常,也不用在每个接口都要组装一遍返回参数,可以参考下面这张对比图:一、SpringBoot不使用统一返回格式默认情况下,SpringBoot会有如下三种返回情况。1.1 字符串@GetMapping("/getUserN

2021-08-10 14:50:31 839

原创 MySql系列:查询优化简单总结

前言有时候圈子很重要,就像上学期间大家都会发现班里有这样一类学生不怎么听课,但是就是学习好。那假如让他回家呆着,不能在课堂里呢?类似的圈子还有;图书馆、网吧、车友群、技术群等等,都可以给你带来同类爱好的人所分享出来的技能或者大家一起烘托出的氛围帮你成长。有人要问博主为什么要对MySql进行优化呢?这个问题我该怎么说呢,只要是一个有过中型以上项目开发经验的人都知道,一条MySql执行性能关乎了你的系统的稳定性以及性能。数据库的四大特征,数据库的隔离级别首先说一个老生常谈的话题,也是面试最喜

2021-08-09 14:11:53 139 2

原创 半自动ORM与全自动ORM框架有什么区别?

什么是 ORM?ORM对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。ORM是面向对象程序设计语言和关系型数据库发展不同步时的解决方案,采用 ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而ORM框架则将这些面向对象的操作转换成底层的

2021-08-07 20:28:29 2516 2

原创 深入理解JVM - 阶段总结与回顾(二)

概述第二阶段的文章回顾和总结 你真的熟悉老年代么?对象在什么时候会进入到老年代? 频繁的FULL GC通常有什么原因 优化JVM需要注意哪些点?你真的熟悉老年代回收么?​ 传统的JVM模型采用固定分代的形式,首先我们来回顾一下老年代的回收触发条件。对象什么时候进入老年代​ 新生代是如何回收内存的?​ 讲述老年代回收之前,我们回顾一下新生代是如何分配内存的,没错,就是采用的 改良复制算法,新生代使用的是eden+2个survior区域进行内存的布局,默认情况下是8:1:1,...

2021-08-04 14:18:43 88

原创 27岁985土木工程研究生,半路出家进军Java,打拼三年后,现在月收入30k+

背景26岁985研究生毕业,学的土木工程相关的专业。工作半年,存款3000,半年后调到深圳总部(公司央企),工作一年差不多也就几万存款,感觉生活无望,就直接决定转行。 说实在的,转行就是奔着挣钱去的。最开始想到的是金融,入坑了后,发现原来还有金融农民工一说,二成人暴富,八成人shishi……万念俱灰。 后来,觉得自己好歹过了计算机二级,也会些matlab,也听说IT工资高,就直接放弃金融农民工,转行IT。转行的时候有两点支撑着我:一是相信我读那么多书,学习能力绝对没问题, 二是以我读书的经验,

2021-08-03 14:00:27 2506 8

原创 「MySQL 系列」- 索引的建立与使用

如何创建索引在创建表的时候创建索引:其中关键字 INDEX 可以用 KEY 替代,INDEX 前面可以加上索引的类型 UNIQUE | FULLTEXT | SPATIAL | NORMAL,默认是 NORMALCREATE TABLE `student` ( `id` bigint NOT NULL, `name` varchar(30), PRIMARY KEY (`id`), INDEX `idx_name` (`name`) -- 对 name 字段加上名为 id..

2021-07-29 16:09:27 571 2

原创 虚惊一场!今天运营在群里说有人删库跑路了,吓得我赶紧去查数据,才发现是有人lombok踩坑了

引言今天中午正在带着耳机听着歌,遨游在代码的世界里,突然就被运营在群里给@了,气冲冲的反问我最近有删生产的用户数据的吗?我肯定客气的回答道没有呀?生产的数据我怎么能随随便便可以删除,这可是公司的红线,再说了我也没有数据库的删除权限啊,不过查询权限还是有的。于是我赶紧登上堡垒机,然后去生产数据库查一下数据,查了一下数据是还在的,吓死了,数据还在问题就不大了,无非就是应用程序出问题了,赶紧打开代码查看下,为什么会少了一条用户数据,看了下代码貌似没啥问题就是比较简单的一个逻辑,直接从DB通过分页查询数..

2021-07-28 15:59:35 180

原创 Mybatis#foreach中相同的变量名导致值覆盖

背景使用Mybatis中执行如下查询:单元测试@Testpublic void test1() { String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.pri..

2021-07-27 15:21:59 481

原创 Redis分布式锁之锁续期的源码透析!针针见血!

时间为何无法评估?你是否一定会有这样的疑问:一个同步代码块,逻辑很简单,完全可以预估一个时间。如果预估不准,通过测试取一个平均时间然后稍微做些预留即可,就可以满足我们对锁设置过期时间的评估。可是对时间的评估并不仅限于简单的业务逻辑,比如像这样一个简单逻辑:判断某条数据是否在数据库中已经存在,如果存在将某个字段更新。逻辑很简单,但是你是否考虑过网络延时导致数据库的链接建立时间较长、连接池中的链接数量不足需要阻塞等待、数据更新的时候需要等待一把较长时间才能释放的写锁等等一系列不可抗拒的因素引发的代码..

2021-07-26 15:39:29 548

原创 吃透MyBatis持久层框架设计思路,手撕核心源码,跟着源码核心流程进行切入分析

1、mybatis 整体功能架构​ mybatis 主要分为三层,从上到下依次为:接口层、数据处理层、基础支撑层,架构图如下所示:2、mybatis 四大核心JDBC组件简介​ mybatis 内置核心4大功能组件,分别是Executor、StatementHandler、ParameterHandler、ResultSetHandler,功能说明 如下:3、mybatis mapper代理工作流程示意图4、mybatis 核心类说明5、mybatis 配置初始化部分

2021-07-23 15:00:24 186

空空如也

空空如也

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

TA关注的人

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