自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

chenssy 的技术博客

专注 Java 技术分享,死磕 Java 系列博主,个人网站:https://www.cmsblogs.com

  • 博客(531)
  • 收藏
  • 关注

原创 【死磕Java并发】----- 死磕 Java 并发精品合集

【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。先来一个总览图:【高清图,请关注“Java技术驿站”公众号,回复:脑图JUC】 【死磕Java并发】—–深入分析synchronized 的实现原理synchronized 可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同...

2018-07-22 15:12:29 14627 6

原创 【死磕 NIO】— 深入分析Buffer

大家好,我是大明哥,今天我们来看看 Buffer。上面几篇文章详细介绍了 IO 相关的一些基本概念,如阻塞、非阻塞、同步、异步的区别,Reactor 模式、Proactor 模式。以下是这几篇文章的链接,有兴趣的同学可以阅读下:【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?【死磕 NIO】— Reactor 模式就一定意味着高性能吗?【死磕 NIO】— Proactor模式是什

2021-11-17 08:30:00 410 1

原创 【死磕 NIO】— Proactor模式是什么?很牛逼吗?

大家好,我是大明哥。上篇文章我们分析了高性能 IO模型Reactor模式,了解了什么是Reactor 模式以及它的三种常见的模式,这篇文章,大明再介绍另外一种高性能IO模型: Proactor。为什么是 Proactor 模式上篇文章 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?大明哥分析了 Reactor模式,我们知道Reactor性能确实非常高,适合高并发场景,但是它依然存在一个问题,那就是它是 同步IO。同步IO会有一个什么问题呢?同步IO需要线程自己等待内核准备好数据,在内

2021-11-09 08:30:00 224 2

原创 【死磕 NIO】— Reactor 模式就一定意味着高性能吗?

大家好,我是大明哥,我又来了。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnP3zhp5-1634901215489)(http://www.cmsblogs.com/images/group/sike-java/sike-nio/nio-2021101310001.png)]为什么是 Reactor一般所有的网络服务,一般分为如下几个步骤:读请求(read request)读解析(read decode)处理程序(process service)

2021-10-22 19:14:50 164

原创 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

通过上篇文章(【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞、非阻塞、异步、非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO。要想彻底弄清楚这五种IO模型,我们需要先弄清楚几个基本概念。基本概念什么是IO什么是IO?维基百科上面是这样解释的:I/O(英语:Input/Output),即输入/输出,通常指数据在存储器(内部和外部)或其他周边设备之间的输入和输出,是信息处理系统(例如计算机)与外部世界(可能是人

2021-10-08 12:00:00 201

原创 【死磕NIO】— 阻塞、非阻塞、同步、异步,傻傻分不清楚

万事从最基本的开始。要想完全掌握 NIO,并不是掌握上面文章(【死磕NIO】— NIO基础详解)中的三大组件就可以了,我们还需要掌握一些基本概念,如什么是 IO,5 种IO模型的区别,什么是阻塞&非阻塞等等,只有掌握了这些基本概念,我们对NIO才能理解得更加得心应手。这篇文章我们就从阻塞&非阻塞,同步&异步说起。同步与异步什么是同步与异步呢?百度百科是这样定义的:同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。异步与同步相对(这解释让我无言相对).

2021-09-21 22:35:08 139

原创 【死磕NIO】— NIO基础详解

Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底层设计。Java NIO 由三个核心组件组件:BufferChannelSelector1缓冲区 BufferBuffer 是一个数据对象,我们可以把它理解为固定数量的数据的容器,它包含一些要写入或者读出的数据。在 Java NIO 中,任何时候访问 NIO 中的数据,都需要通过缓冲区(Buffer)进行操作。读取数据时,直接从缓冲区中读取,写入数据时,写入至缓冲区。NIO 最常

2021-09-08 23:08:02 1258 7

原创 【死磕 Java 基础】 — 你以为异常就是 try…catch ?那你天真了

大家好,我是大明哥。个人网站:https://www.cmsblogs.com/前言我敢说对于很多小伙伴来说,他们以为在 Java 中异常就是 try...catch,稍微有点儿意识的还会用下 throw new Exception,真的有这么简单吗?请宽恕小编直言,你对 Java 异常一知半解。以下是小编对 Java 异常的理解,如有错误之处,请原谅,资质有限。引出异常先问一个问题,在 Java 中,你是赞同使用返回码还是异常来规范错误呢?我先来说说使用返回码的情况,比如登录逻辑,我们分.

2021-08-08 21:17:49 3549 26

原创 【死磕 Java 基础】— 我同事一个 select 分页语句查出来了 3000W 条数据

大家好,我是大明哥某天我正在工位上听着 Vicotry,愉快地敲着 hello world ,这感觉就像我写的代码能征服世界。突然运维给我打了一个电话,说我们某台服务器 OOM 了,要我过去看下,这感觉就像 xxx,你懂的。去运维室、登录服务器、查看日志、…一顿操作猛如虎,看到一个 List 对象 600MB +(原谅我们服务器 low,运维比较小气,就给 1C2G 的服务器),检查当时的 SQL 语句,一看,我的乖乖,将近 4000w + 条数据。我的第一感觉就是,难道又是哪个业务在导出大批量数.

2021-07-18 19:55:57 5750 44

原创 【死磕 Java 基础】--- 我一口气自己就动手实现一个 LRU

大家好,我是大明哥个人网站:https://www.topjava.cn/LRU,即 Least Recently Use ,直译为 “最近最少使用”。它是根据数据的历史访问记录来进行数据淘汰的,淘汰掉最先访问的数据,其核心思想是 如果数据最近被访问过,那么将来被访问的几率也会更加高。要实现 LRU,需要做到两点:查询出最近最晚使用的项给最近使用的项做一个标记实现的方案有多种,这里小编主要介绍两种:LinkedHashMap双向链表 + HashMapLinkedHashMa.

2021-07-11 09:43:41 674 15

原创 【死磕 Java 基础】 — 谈谈那个写时拷贝技术(copy-on-write)

大家好,我是大明哥。个人网站:https://www.topjava.cn/copy-on-write,即写时复制技术,这是小编在学习 Redis 持久化时看到的一个概念,当然在这个概念很早就碰到过(Java 容器并发有这个概念),但是一直都没有深入研究过,所以趁着这次机会对这个概念深究下。所以写篇文章记录下。COW(copy-on-write 的简称),是一种计算机设计领域的优化策略,其核心思想是:如果有多个调用者(callers)同时要求相同资源(如内存或磁盘上的数据存储),他们会共同获取.

2021-07-04 18:03:31 437 11

原创 【死磕 Redis】----- Redis 数据结构:对象(RedisObject)

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』在前面几篇文章中,小编陆陆续续介绍了 Redis 用到的所有主要数据结构,如比如简单动态字符串(SDS)、字典(dict)、压缩列表(ziplist)、整数集合( intset)、跳跃表(skiplist)。然而 Redis 并没有直接使用这些数据结构来实现键值对的数据库,而是在这些数据结构之上又包装了一层 RedisObject(对象),RedisObject 有五种对象.

2021-06-27 21:23:52 236 1

原创 【死磕 Redis】----- Redis 数据结构: intset

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』intset 是 Redis 实现 Set 的底层实现之一,当集合元素不大于设定值并且元素都是整数时,就会用 intset 作为 Set 的底层数据结构。它有如下几个特点:元素类型只能为数字元素有三种类型:int16_t、int32_t、int64_t元素有序且不可重复和 SDS 一样,intset 也是内存连续的,就像数组一样下面是数据结构的定义:typ.

2021-06-27 21:23:20 145 1

原创 【死磕 Redis】----- Redis 数据结构: skiplist

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』关于跳跃表其实在 JUC 里面有一个并发容器就是利用跳跃表来实现的:ConcurrentSkipListMap(【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentSkipListMap)。这篇博客我们来分析 Redis 里面的跳跃表。skiplist什么是跳跃表?百度百科是这么定义的:跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有.

2021-06-27 21:22:43 123

原创 【死磕 Redis】----- Redis 数据结构:ziplist

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』这篇文章我们来分析 Redis 数据结构的第三个:ziplist。什么是 ziplist什么是 ziplist?Redis 官方是这样定义的:The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. It stores bot.

2021-06-27 21:22:12 127

原创 【死磕 Redis】----- Redis 数据结构:sds

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』字符串使我们在编程过程中使用最为广泛的对象了,在 Redis 中同样如此。我们知道 Redis 是 C 语言实现的,但是 Redis 放弃了 C 语言传统的字符串而是自己创建了一种名为简单动态字符串 SDS(Simple Dynamic String)的抽象类型,并将 SDS 用作 Redis 的默认字符串表示,其主要原因就是传统的字符串表示方式并不能满足 Redis 对字.

2021-06-27 21:21:35 129 2

原创 【死磕 Redis】----- Redis 数据结构:dict

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』字典,又称映射,是一种用于保存键值对的抽象数据结构。在 Redis 中,字典得到了广泛的使用,比如 Redis 的数据库就是使用字典来作为底层实现的Redis 中的字典有 dict.h/dict 结构表示,如下:typedef struct dict { // 类型特定函数 // type里面主要记录了一系列的函数,可以说是规定了一系列的接口 d.

2021-06-27 21:20:55 271 4

原创 【死磕 Redis】----- Redis 集群搭建

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』Redis 是一个可基于内存亦可持久化的日志型(aof,rdb)、高性能 Key-Value 数据库,并提供多种语言的API ,Redis 支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。本文将详细介绍 Redis cluster 搭建过程,集群为三主三从。准备工作本次集群准备三台服务器(虚拟机也可以),每台服.

2021-06-27 21:20:14 115

原创 【死磕 Redis】----- info 命令详解

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』Redis 提供了一个非常有用的查看状态信息的命令:info。它以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。使用方法有如下三种:info:部分Redis系统状态统计信息。info all:全部Redis系统状态统计信息。info section:某一块的系统状态统计信息,其中section可以忽略大小写。详细内容如下表格:.

2021-06-27 21:19:44 179 1

原创 【死磕 Redis】------ 理解 Redis 的内存

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』我们知道 Redis 的所有数据都存储在内存中,内存是我们系统中的一个非常珍贵的资源,不能随意浪费,所以如何合理高效地利用 Redis 内存就变得非常重要了。本文从两个方面来阐述 Redis 的内存机制:知道 Redis 的内存主要消耗在什么地方如何管理内存查看内存在文章【死磕 Redis】----- info 命令详解介绍了 info memory 命令可以查.

2021-06-27 21:19:39 154

原创 【死磕 Redis】----- 哨兵(二):基本原理

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』上篇博文【死磕 Redis】— 哨兵(一):部署哨兵架构 介绍了 Redis Sentinel 是一个能够自动完成故障发现和故障转移并通知应用方,从而实现真正的高可用的分布式架构 ,他具备 监控、通知、自动故障转移等功能,同时详细演示了哨兵的架构部署和自动故障转移,相信各位小伙伴对 Redis 哨兵机制有了一个简单的认识,这篇博文将详细介绍哨兵的基本原理,包括:心跳机制.

2021-06-27 21:18:30 121

原创 【死磕 Redis】----- 哨兵(一):部署哨兵架构

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』在介绍 Redis 主从复制的时候,提到了相比于单机的 Redis 架构,主从复制架构具有如下优势:保证数据安全性。从节点作为主节点备份,一旦主节点不可用,从节点可以顶上去,保证了数据尽量不被丢失提高读能力。主从读写分离,横向扩展的系统的读负载Redis 高可用的基础但是主从复制架构有一个非常致命的问题,那就是一旦主节点由于故障不可用时,需要手动将一个从节点晋升.

2021-06-27 21:17:56 156 1

原创 【死磕 Redis】----- 主从复制(三):注意的问题

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』前面两篇博客已经详细介绍了主从复制的原理,相信各位对 Redis 的主从复制有了一个比较深入的了解,这篇博客主要介绍主从复制的应用以及它的一些问题。读写分离我们都知道对于读多写少的场景,我们可以使用读写分离的方式来提供整体的并发量,对于 Redis 也一样,由于从节点是主节点的副本,我们可以利用主节点提供写服务,一个或者多个从节点提供读服务,这样就最大化 Redis 的.

2021-06-27 21:17:18 91

原创 【死磕 Redis】----- 主从复制(二):全量复制和部分复制

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』在上篇博客【死磕 Redis】— 主从复制(一) 提到,主从节点在数据同步阶段,主节点会根据当前状态的不同执行不同复制操作,包括:全量复制 和 部分复制,这篇博文将详细介绍这两种情况。全量复制:用于首次复制或者其他不能进行部分复制的情况。全量复制是一个非常重的操作,一般我们都要规避它部分复制:用于从节点短暂中断的情况(网络中断、短暂的服务宕机)。部分复制是一个非常轻量.

2021-06-27 21:16:45 288 3

原创 【死磕 Redis】----- 主从复制(一):概述

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』在前面持久化文章中(【死磕 Redis】— 持久化)阐述了,单台服务器是如何保证数据安全性的,它保证了即使 Redis 服务器因为宕机而重启也不会丢失数据,因为他将内存中的数据持久化到硬盘中了,在重启的时候只需要重新加载即可,但是如果硬盘坏了呢?是不是就没救了,就算硬盘没坏,你去重启 Redis 应用,服务不可用得产生多发的负面影响?所以我们应该尽量避免这种因为单点故障而导.

2021-06-27 21:16:00 155 1

原创 【死磕 Redis】----- 持久化

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』我们知道 Redis 的数据全部都存储在内存中,如果 Redis 服务器突然宕机,则会导致数据全部丢失,所以必须要有一种机制来保证 Redis 的数据不丢失或者丢失很少一部分,这种机制就是 Redis 的持久化机制。Redis 的持久化则是将内存中的数据持久备份到硬盘中,在服务重启时可以恢复。Redis 目前提供了两种持久化方式:RDB,即 Redis DataBa.

2021-06-27 21:15:29 114

原创 【死磕 Redis】----- 如何排查 Redis 中的慢查询

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』我们知道 MySQL 提供了慢查询日志帮助我们定位系统存在的慢操作,同样在 Redis 里面也提供了类似的功能。所谓慢查询日志就是系统记录那些执行时间超过预设阀值的命令,包括发生时间、耗时、命令的详细信息等相关信息都记录下来。慢查询的作用:通过慢查询分析,找到有问题的命令进行优化。Redis 执行命令分为四个步骤:发送命令、命令排队、执行命令、返回结果。需要注意的是,慢.

2021-06-27 21:11:14 137

原创 【死磕 Redis】----- 发布与订阅

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』Redis 提供了基于“发布/订阅”模式的消息机制,发送者(publish)发布消息,订阅者(subscribe)接收消息,两者之间不需要进行直接通信,他们之间通过频道进行消息传递。发布者向指定的频道(channel)发布消息,订阅了该频道的订阅者都可以接收到该消息。Redis 中相关的命令如下:PSUBSCRIBE pattern [pattern …]:订阅一个.

2021-06-27 21:10:40 131 1

原创 【死磕 Redis】----- 布隆过滤器

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』布隆过滤器在讲述布隆过滤器的原理之前,我们先思考一个问题,如果想要判断一个元素是否存在,你通常会怎么做?一般的做法都是将其保存起来然后通过比较确认,一共会有如下几种情况:如果使用线性表或者数组存储,则查找的时间复杂度为 O(n)。如果使用树存储,则查找的时间复杂度为 O(logn)。如果使用哈希表存储,则查找的时间复杂度为 O(log(n/m)),m 为哈希分桶数.

2021-06-27 20:56:35 121

原创 【死磕 Redis】----- 理解 pipeline 管道

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』在前面博客中小编提到过 Redis 性能瓶颈主要是网络,主要原因就在于 Redis 执行命令的时间通常在微妙级别。正常情况下,我们执行一条 Redis 命令流程要经过如下几个步骤:客户端发送 Redis 命令,阻塞等待 Redis 应答Redis 接收到命令,执行命令应答,客户端收到响应信息其中 1 、3 称之为一次 RTT(Round Trip Time)。.

2021-06-27 20:55:41 93

原创 【死磕 Redis】----- 事务

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』Redis 通过 MULTI、EXEC、DISCARD、WATCH 、UNWATCH 来实现事务功能,Redis 事务具备如下几个特性Redis 会将事务中的多个命令一次性、按顺序一次执行,在执行期间可以保证不会中断事务去执行其他命令Redis 的事务机制是不能保证原子性的,它只保证隔离性和一致性。Redis 事务详解Redis 的事务形式如下:multi.

2021-06-27 20:55:00 79

原创 【死磕 Redis】----- Redis 的线程模型

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』Redis 在单线程下还可以支持高并发的一个重要原因就是 Redis 的线程模型:基于非阻塞的IO多路复用机制。这篇文章就 Redis 的线程模型做详细说明。Redis 是基于 reactor 模式开发了网络事件处理器,这个处理器叫做文件事件处理器(file event handler)。由于这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。采用 IO .

2021-06-27 20:54:27 76

原创 【死磕 Redis】----- Redis 通信协议 RESP

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』我们在第一次成功安装完 Redis ,启动 Redis 服务后,都会通过 ping 命令来测试 Redis 服务是否启动成功,如果服务启动成功则会响应 PONG,否则启动失败。这么一个简单的过程就完成了 Redis 客户端 - 服务端的一次交互。我们知道,Redis 客户端与服务端是通过命令的方式来完成交互过程的,主要分为两个部分:网络模型和序列化协议。前者讨论的是数据交.

2021-06-27 20:53:13 81

原创 【死磕 Redis】----- 开篇

原文:https://www.topjava.cn/category/1391389927996002304 『chenssy』Redis 的重要性不需要小编再次强调,无论是你工作中,还是面试中,你几乎不可能离开他,尤其是面试中,几乎每次面试都会被问到,他也是区分你实力的一个重要标志,小编有一次面试就是夭折在 Redis,那时对 Redis 的了解仅限于客户端的使用和对 Redis 分布式锁有点儿了解,连集群都没有部署过。在写这篇文章的半年前,小编对 Redis 同样仅限于 jedis/Redis.

2021-06-27 20:51:58 74

原创 【死磕 Spring】----- 4 张图带你读懂 Spring IOC 的世界

原文:https://www.topjava.cn/category/1391374860344758272 『chenssy』bean 的转换过程下面这张图演示了一个可用的 bean 是如何从 xml 配置文件中演变过来的。ApplicationContext 的架构图loadBean 的全流程getBean 的全流程...

2021-06-26 22:18:43 112 1

原创 【死磕 Spring】----- 深入分析 ApplicationContext 的 refresh()

原文:https://www.topjava.cn/category/1391374860344758272 『chenssy』上篇博客只是对 ApplicationContext 相关的接口做了一个简单的介绍,作为一个高富帅级别的 Spring 容器,它涉及的方法实在是太多了,全部介绍是不可能的,而且大部分功能都已经在前面系列博客中做了详细的介绍,所以这篇博问介绍 ApplicationContext 最重要的方法(小编认为的) :refresh()。refresh() 是定义在 Configu.

2021-06-26 22:17:42 92 1

原创 【死磕 Spring】----- IOC 之 分析 bean 的生命周期

原文:https://www.topjava.cn/category/1391374860344758272 『chenssy』在分析 Spring Bean 实例化过程中提到 Spring 并不是一启动容器就开启 bean 的实例化进程,只有当客户端通过显示或者隐式的方式调用 BeanFactory 的 getBean() 方法来请求某个实例对象的时候,它才会触发相应 bean 的实例化进程,当然也可以选择直接使用 ApplicationContext 容器,因为该容器启动的时候会立刻调用注册到该.

2021-06-26 22:17:09 79

原创 【死磕 Spring】----- Spring 的环境&属性:PropertySource、Environment、Profile

原文:https://www.topjava.cn/category/1391374860344758272 『chenssy』spring.profiles.active 和 @Profile 这两个我相信各位都熟悉吧,主要功能是可以实现不同环境下(开发、测试、生产)参数配置的切换。其实关于环境的切换,小编在博客 【死磕Spring】----- IOC 之 PropertyPlaceholderConfigurer 的应用 已经介绍了利用 PropertyPlaceholderConfigurer.

2021-06-26 22:16:38 141 1

原创 【死磕 Spring】----- IOC 之 BeanDefinition 注册机:BeanDefinitionRegistry

原文:https://www.topjava.cn/category/1391374860344758272 『chenssy』将定义 bean 的资源文件解析成 BeanDefinition 后需要将其注入容器中,这个过程由 BeanDefinitionRegistry 来完成。BeanDefinitionRegistry:向注册表中注册 BeanDefinition 实例,完成注册的过程。下图是 BeanDefinitionRegistry 类结构图:BeanDefinitionRegi.

2021-06-26 22:16:01 62

原创 【死磕 Spring】----- IOC 之 bean 的实例化策略:InstantiationStrategy

原文:https://www.topjava.cn/category/1391374860344758272 『chenssy』在开始分析 InstantiationStrategy 之前,我们先来简单回顾下 bean 的实例化过程:bean 的创建,主要是 AbstractAutowireCapableBeanFactory.doCreateBean() ,在这个方法中有 bean 的实例化、属性注入和初始化过程,对于 bean 的实例化过程这是根据 bean 的类型来判断的,如果是单例模式,.

2021-06-26 22:15:27 52 1

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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