自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 创建线程的三种方式详解

Java实际创建线程流程,以及创建线程三种方式的详解及区别。

2022-06-05 20:54:46 283 1

原创 数据库事务的隔离级别与并发事务异常

数据库事务的ACID特性中,I为Isolation的缩写,即隔离性,隔离性指在不同业务的处理过程中,事务能够对各业务正在读、写的数据相互独立做出保证,不会相互影响。本文主要阐明数据库并发事务中常见的异常情况,如脏读、可重复读、幻读等情况,以及各常见隔离级别分别能够解决什么样的问题。

2022-05-19 01:33:24 565

原创 Redis5.0 数据结构之整数集合intset源码详解

文本将基于源码分析Redis中整数集合intset的数据结构以及各操作的实现。本文源码版本为Redis 5.0,本篇博文中出现的源码均可以在intset.h以及intset.c两个文件中找到。源码阅读不易,如出现纰漏或理解错误,还望读者指正。

2022-02-18 16:56:46 419

原创 深入理解Redis 事务机制及执行流程源码解析

本篇文章将从源码角度分析整个Redis事务执行的流程,包括MULTI、EXEC、DISCARD、WATCH命令的源码实现以及相关数据结构。本文源码版本为Redis 5.0,文中涉及到的源码均可在server.h、server.c以及multi.c三个文件中找到。源码阅读不易,如出现纰漏或理解错误还望指正。

2022-02-17 22:24:14 885

原创 Redis WATCH事务监视机制与回滚

笔者Redis事务相关文章链接:Redis 事务机制深入浅出概述Redis内置了WATCH命令,使用WATCH命令可以实现乐观锁的功能,在事务被EXEC命令执行前,如果此前被WATCH监视的某数据库键已经被修改过,则拒绝执行当前事务,返回空并重置客户端事务标识。在并发场景下易使用该命令,很容易理解,有并发的场景就有同步处理。WATCH的使用首先明确一点,底层实现中每个Redis客户端内都有一个用于标识事务状态的属性,在每一条命令送到服务器端时,在执行前都会先检查该属性,因为同一条命令在事务状态和非事

2022-02-17 15:03:36 1609

原创 Redis 事务机制深入浅出

什么是Redis事务Redis的事务就是一组命令的集合。Redis提供了将一组命令打包集合的方法,并且能够一次性、按顺序的执行多个命令,事务执行期间,服务器不会中断事务改为执行其他客户端的命令请求,只有事务中所有命令都执行完毕后,服务器才会处理其他客户端的命令请求。在开始说明事务的使用与基本流程之前,需要先说明关于Redis和事务的两个问题。Redis事务具有原子性吗?先给出结论:Redis单条命令具有原子性,Redis事务是否具有原子性存在争议。笔者认为关于Redis事务原子性的争议存在的主要原

2022-02-17 12:56:23 801

原创 LeetCode 11. 盛最多水的容器 II && 双指针

题目要求原题目链接:11. 盛最多水的容器题目要求如下:给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例如下:示例1:输入:[1,8,6,2,5,4,8,3,7]输出:49解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表

2022-02-15 15:29:50 134

原创 Redis 哈希hash常用命令总结

Redis中文官网命令大全hash常用命令汇总命令语法语义hsethset key field value设置哈希集key中指定字段field的值为valuehmsethmset key field value [field value …]设置哈希集key中若干指定字段field的值为valuehsetnxhsetnx key field value在哈希集key中不存在字段field时,添加字段field并将其值设为valuehdelhdel k

2022-02-15 12:33:25 742

原创 Redis 集合set常用命令总结

Redis中文官网命令大全set常用命令汇总命令语法语义saddsadd key member [member …]添加若干指定元素member到key集合中,并返回成功添加元素个数spopspop key [count]与srandmember相似,随机移除并返回集合key中若干随机元素sremsrem key member [member … ]在集合key中移除指定元素,并返回成功移除元素个数scardscard key返回指定集合key中的

2022-02-14 22:12:25 1518

原创 Java并发编程之CAS简析与ABA问题的解决方案

什么是CASCAS全称Compare And Swap,即比较并交换。CAS的功能是,先判断内存中的目标变量与给定期望值是否相同,如果相同,则为目标变量赋一个新值。CAS是乐观锁的一种实现,在锁竞争不大的情况下使用CAS实现同步的效率比悲观锁(synchronized等3)同步实现高,在Java并发包中具有广泛应用。Java中CAS的并发原语全部体现在sum.misc.Unsafe类中,Unsafe类中的方法均为native方法,在相对应的C语言的函数实现中,最终在C函数中调用汇编指令实现CAS操作。总

2022-02-14 12:01:57 722

原创 Redis 5.0数据结构之压缩列表ziplist源码详解(二)

前文已经提及了压缩列表ziplist的主要设计初衷是尽量节约空间,因此设计出了一系列的压缩编码,将ziplist设计成了内存地址连续,使用基地址+偏移量的方式来访问压缩列表内节点,并且说明了压缩列表节点结构具有的属性以及相应的作用,通过源码分析了对于节点内各属性的编码的实现细节。

2022-02-12 18:07:20 727

原创 Redis 5.0数据结构之压缩列表ziplist源码详解(一)

Redis基于C语言开发,由于C并未内置链表,因此Redis自己实现了一系列链表,有双端链表linkedlist、压缩列表ziplist、快速链表quicklist等,本篇将从源码角度展现压缩列表ziplist。

2022-02-11 11:34:33 978

原创 LeetCode 134. 加油站 II && 贪心算法

题目要求原题目链接:134. 加油站题目要求如下:在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明:如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。示例如下:示例1:输入:gas = [

2022-02-10 19:53:05 989

原创 LeetCode 113. 路径总和 II && 深度优先搜索

题目要求原题目链接:113. 路径总和 II题目要求如下:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例如下:示例1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4,11,2],[5,8,4,5]]示例2:输入:root = [1,2,3], targetSum =

2022-02-10 12:43:17 442

原创 LeetCode 112. 路径总和 && 广度优先搜索|二叉树递归

题目要求原题目链接:112. 路径总和题目要求如下:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例如下:示例1:>输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解

2022-02-10 12:18:13 140

原创 LeetCode 695. 岛屿的最大面积 && 广度|深度优先搜索

LeetCode 695. 岛屿的最大面积 && 广度|深度优先搜索

2022-02-08 20:39:04 356

原创 Redis 字符串string常用命令总结

Redis中字符串string常用命令、语法、语义总结。

2022-02-08 15:13:24 780

原创 Redis 链表list常用命令总结

Redis 链表list常用命令汇总

2022-02-08 10:42:13 603

原创 Redis 5.0数据结构之双端链表linkedlist源码解析

概述链表可以提供高效节点重排和顺序性节点访问的方式,并且可以通过增删节点灵活的调整链表长度。Redis基于C语言开发,C语言并未内置链表,因此Redis自己实现了一系列链表,分别是双端链表linkedlist、压缩链表ziplist、快速链表quicklist等,本篇将从源码角度展现双端链表linkedlist。

2022-02-07 20:08:07 900

原创 LeetCode 3. 无重复字符的最长子串 && 滑动窗口

题目要求原题目链接:3. 无重复字符的最长子串题目要求如下:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例如下:示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。———————————————————————————————————————————示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。———————————

2022-02-06 11:47:26 127

原创 LeetCode 322. 零钱兑换 && 动态规划

题目要求原题目链接:322. 零钱兑换题目要求如下:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例如下:示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-

2022-02-05 12:59:22 324

原创 LeetCode 198. 打家劫舍 && 动态规划

题目要求原题目链接:198. 打家劫舍题目要求如下:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例如下:示例1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高

2022-02-05 12:03:18 121

原创 Redis SDS简单动态字符串与C字符串的区别

本文只解析SDS与C字符串区别,建议搭配相关实现源码阅读,关于SDS源码实现,可以参考笔者之前的文章Redis 5.0数据结构之SDS简单动态字符串实现源码详解SDS概述Redis基于C语言实现,但Redis并没有采用C语言中传统的字符串表示,而是特别构建了一种叫做简单动态字符串(simple dynamic string)的数据结构,简称SDS,SDS是Redis中默认的字符串表示。C字符串只在无须对字符串值修改的场景下作为字面量使用,如日志打印,而在字符串值可能被修改的场景下,均使用SDS表示字符

2022-02-01 18:08:52 1673

原创 Redis 5.0数据结构之SDS简单动态字符串实现源码详解

基于Redis5.0源码分析SDS的实现,主要解析SDS的数据结构,通过源码分析了SDS的初始化流程、扩容、空间预分配和惰性空间释放。

2022-02-01 16:29:32 1365

原创 LeetCode 23. 合并K个升序链表 && 有序链表的合并

题目要求原题目链接:23. 合并K个升序链表题目要求如下:给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例如下:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5-&g

2022-01-28 01:01:42 163

原创 LeetCode 25. K 个一组翻转链表 && 链表反转

LeetCode 25. K 个一组翻转链表 && 链表反转

2022-01-27 19:58:13 734

原创 Java反转链表的两种方式

Java中实现头插法反转链表和原地反转链表,分析实现思路和实现代码

2022-01-25 15:11:35 583

原创 万字教学 | 基于注解实现的Spring IoC容器/框架简单仿写

简述本文将对Spring IoC容器的仿写进行剖析,梳理仿写过程中需要解决的问题,并附全部仿写代码进行说明教学,本文的仿写中不引用任何外部类,纯手动实现简要IoC控制反转执行流程。对IoC的作用不熟悉或不了解什么是控制反转的读者,可以先参考笔者先前的文章或查阅其他资料:IoC控制反转的原理思想仿写Spring IoC需要解决哪些问题想要顺利并且理解的仿写一个IoC框架,在动手前应该先理清要解决的问题,或者说IoC框架的执行流程。笔者将IoC执行流程大致归纳为了以下几个步骤:对指定包路径进行扫描

2022-01-23 23:39:29 664

原创 Spring IoC控制反转原理/思想

IoC,全称Inversion of Control,即控制反转。IoC并不是某一具体的技术,而是一种设计思想,Spring IoC框架/容器就是IoC这一思想的具体实现。

2022-01-23 16:28:07 564

原创 LeetCode142.环形链表 II&&判断链表成环入口

题目要求原题目链接142.环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。示例如下:输入:head = [3,2,0,-4], pos = 1输出:返回索引

2022-01-23 11:54:00 592

原创 LeetCode141. 环形链表&&判断链表是否有环

题目要求原题目链接:141. 环形链表题目要求如下:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。...

2022-01-22 16:13:11 264

原创 Java异常体系中finally和return执行顺序的反编译分析详解

Java异常体系中,在try块或catch块内使用return时,可能会出现出乎开发人员预料的结果,引发问题的主要原因是对finally和return的执行顺序的不熟悉,本文将对相关代码进行反编译,分析其执行顺序。

2022-01-19 18:41:35 318

原创 Java中equals和==的区别

问题实际使用时,可能出现==和equals比较结果不一致的情况,以String为例,测试代码如下: public static void main(String[] args) { String str1 = "123"; String str2 = "123"; String str3 = new String("123"); String str4 = new String("123"); System.out.pr

2022-01-19 11:02:53 184

原创 Java Integer128陷阱详解

Integer128陷阱什么是128陷阱首先看一下问题是什么,测试代码如下:public static void main(String[] args) { Integer i1 = 127; Integer i2 = 127; Integer i3 = 128; Integer i4 = 128; int i5 = 128; int i6 = 128; System.out.println(i1 == i2); System.out.p

2022-01-17 00:34:49 4328 4

原创 Java中Byte与Short运算时转型问题

总结并通过反编译分析了为什么byte和short型运算结果都是int类型以及为何这样设计

2022-01-17 00:03:21 825

原创 Java Happens-Before规则及其作用

本文主要列出Happens-Before规则,介绍Happens-Before的作用以及JMM中为什么要有Happens-Before规则的存在。Happens-Before规则主要有两个作用,一个是解决数据竞争问题,另一个是为开发人员提供足够强的内存可见性。数据竞争数据竞争就是指并发条件下的状态属性不同步而引发的读写不一致问题。现假设有两个线程A、B要对内存中的同一个变量进行访问,线程A要对这个变量执行写操作,线程B要对这个变量执行读操作,两个操作是同时进行的,此时若不加以限制,线程B读操作所得到

2022-01-10 18:28:39 512

原创 Java内存模型JMM与顺序一致性模型关于的对比与内存可见性讨论

**本文将主要围绕内存可见性展开讨论**,并横向对比其与顺序一致性内存模型的异同,探究Java内存模型在可见性问题上是如何规范的。其中在Java内存模型中内存可见性部分,主要涉及指令重排序相关的可见性问题,数据缓存相关的可见性问题不重点介绍。

2022-01-09 22:57:59 272

原创 Java双重检查锁定问题DCL

双重检查锁定双重检查锁定,即Double-Checked Lock问题,是并发编程中由于指令重排和不正确同步导致的经典并发问题延迟初始化在介绍本文重点双重检查锁定前,必须要先了解双重检查锁定问题是由何而来的。学习过Spring的同学一定都听过懒加载(lazy-init),延迟初始化与懒加载是同类型的思想,都是为了避免、推迟不必要的高性能开销操作或降低程序的启动时间。而本文要讨论的双重检查锁定就是为了延迟初始化服务的,详见下文。单线程环境下的延迟初始化在假定的单线程环境下,下列代码就可以很好的实现

2022-01-08 20:01:30 729 2

原创 反射和序列化破坏单例模式及解决方案

单例模式破坏及解决方案在单例模式的七种实现方式中除了枚举外六种单例模式的实现方式存在一个共同的缺陷,就是存在可以创建多个实例的方法,有两种方法可以破坏单例的唯一性。反射单例测试类如下,使用双重检查锁定实现方式:public class DCLSingleton /* implements Serializable */{ private static volatile DCLSingleton instance; private DCLSingleton() {}

2022-01-03 22:48:41 315

原创 Java单例模式Singleton及其七种实现方式

什么是单例模式简述单例模式(Singleton Pattern)是创建型设计模式中最简单且应用最为广泛的设计模式之一,单例模式属于创建型模式,提供了一种对象创建的思路。使用单例模式时,目标类被要求确保有且仅有一个实例,对于系统任一对目标类的访问,不需要单独实例化类,只需要访问由目标类负责创建的唯一对象实例即可。特点使用单例模式的目标类仅有一个实例由目标类自行创建管理唯一实例目标类对外提供实例访问方法应用场景出现以下场景,可以考虑使用单例模式某类实例需要被频繁的创建,使用后需要频繁销

2022-01-03 21:20:28 379

空空如也

空空如也

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

TA关注的人

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