- 博客(101)
- 收藏
- 关注
原创 Java 多线程启动为什么调用 start() 方法而不是 run() 方法?
多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗?在探讨这个问题之前,我们先来了解一些多线程的基础知识~线程的状态Java 中,定义了 6 种线程状态,在 Thread 类可以找到:// 为了节约空间,我删除了注释public enum State { NEW,//初始状态 RUNNABLE,//运行状态 BLOCKED,// 阻塞状态 WAITING,//等待状态
2020-05-12 14:58:22
1941
原创 Java 经典面试题:聊一聊 JUC 下的 LinkedBlockingQueue
本文聊一下 JUC 下的 LinkedBlockingQueue 队列,先说说 LinkedBlockingQueue 队列的特点,然后再从源码的角度聊一聊 LinkedBlockingQueue 的主要实现~LinkedBlockingQueue 有以下特点:LinkedBlockingQueue 是阻塞队列,底层是单链表实现的~元素从队列尾进队,从队列头出队,符合FIFO~可以使用 ...
2020-05-08 13:18:02
885
原创 Java 经典面试题:聊一聊 JUC 下的 CopyOnWriteArrayList
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因:1、 ArrayList 自身的 elementData、size、modCount 在进行操作的时候,都没有加锁;2、这些变量没有被 volatile 修饰,在多线程的情况下,对这些变量操作可能会出现值被覆盖的情况;如果我们想在多线程情况下使用 A...
2020-05-07 15:00:08
865
原创 朋友圈你维护好了吗?这些坏味道,你又占了几种?
朋友圈我们常用的微信功能之一,但是我们大部分人都没有把它维护好,只是单纯的把它当做私人领域,想发表啥就发表啥,总体来说,好像也没有什么毛病。朋友圈并非是私人领域这么简单,朋友圈是围绕你聚集的一个朋友圈子,少则几十人,多则几千人,它有一定的公域性。你发一句负能量爆棚的话,破坏一堆人的心情,你发一段美好的文字,慰藉一群人的心情。而且朋友圈也并非没有价值,只是我们没有重视而已。我隐约记得某位大佬分享...
2020-05-06 14:43:12
2093
1
原创 基于 XA 事务协议,用代码实现一个二阶段分布式事务
在上篇《漫谈分布式事务的那些解决方案》文章中,我提到了分布式事务的三种通用解决方案,但是没有具体的代码实现,有少小伙伴留言说原理知道了,但是还是不会写代码,那么这篇文章就简单聊一聊基于 XA 事务协议,用代码来实现二阶段提交。在具体的 Demo 之前,先来补充一点 XA 事务的知识:DTP 模型与 XA 规范。DTP 模型与 XA 规范是由 X/Open 维护,也就是现在的 open grou...
2020-04-29 13:46:08
1312
原创 戴上 CAP 这顶帽子,又能和面试官扯皮了
随着微服务和分布式系统的广泛运用,CAP 定理被大家熟悉起来,也成为了分布式系统的三大指标。这篇文章我们就来聊一聊 CAP 定理。CAP 定理1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:Consistency.Availability.Partition Tolerance.Eric Brewer 说,这三个指标不可能同时做到。然后就取首...
2020-04-29 13:39:27
691
原创 漫谈分布式事务的那些解决方案
事务我们都不陌生,我们常说的事务一般都是指单机事务,即本地事务。那分布式事务是什么?分布式事务就是由多个本地事务组合而成的事务,一般在分布式场景下才会出现。比如电商平台中,我们在购物的时候,下单支付这个过程看上去是一气呵成的,但是背后可能是多个系统的分工合作。订单系统、支付系统、物流系统等。这些系统部署在不同的服务器上,执行的都是各种的事务,对于电商平台来说,这就是分布式事务。本地事务都好解决...
2020-04-21 09:21:33
750
原创 送给求职者的一份硬核面试指南,你可以不优秀,但是你必须重视!
今年受这波疫情的影响,大环境不太好,金三银四是指望不上了,能有岗位提供就不错了。很多公司都冻结 HC ,并且裁员、倒闭的公司一大堆。这时候有一份稳定的工作挺好的,最起码不要去跟那些 985/211 的研究生、大厂牛人竞争那少的可怜的岗位。如果公司工资正常发放,甚至还能加薪,那就安心干吧,别瞎折腾了。即使你有很多不满意的地方,那就忍着,过段时间会好起来再说。如果非要走,一定不要裸辞。当然存在被裁...
2020-04-14 09:10:53
2596
5
原创 RocketMQ 源码分析之路由中心(NameServer)
你可能没有看过 RocketMQ 的架构图,没关系,一起来学习一下,RocketMQ 架构图如下:在 RocketMQ 中,有四个角色:Producer:消息的生产者,每个 MQ 中间件都有。Consumer:消息的消费者,每个 MQ 中间件都有。NameServer:RocketMQ 的路由中心,跟 ZooKeeper 差不多。Broker:消息服务器,RocketMQ 的消息全部...
2020-04-10 09:12:42
840
原创 探秘 RocketMQ 消息持久化机制
我们知道 RocketMQ 是一款高性能、高可靠的分布式消息中间件,高性能和高可靠是很难兼得的。因为要保证高可靠,那么数据就必须持久化到磁盘上,将数据持久化到磁盘,那么可能就不能保证高性能了。RocketMQ 在兼容这两方面做的不错,先从磁盘说起,现代的磁盘都是高性能的,写速度并不一定比网络的数据传输速度慢。比如 SSD 固态硬盘在 M.2 NVMe协议下,顺序写的速度可以达到 1500 MB/...
2020-04-09 09:12:09
1825
原创 除专业知识外,你还需要具备的几种能力
在职场上,我们首先需要过硬的专业知识,它是我们的生存之本。但是人是惰性的,很多时候并不会主动输入,那么大学所学的那些专业知识,其实不足以对抗漫长的职业生活。想要在职场上走的好,除了专业知识之外,我们还需要具备哪些能力?最近在看吴军老师的《谷歌方法论》,在里面找到了相应的答案。除了专业知识之外,我们还需要具备以下三种意识。明确方向和目标意识在职业发展路径中,我们首先需要明确自己的目标,这就像航...
2020-04-05 09:45:52
2004
原创 聊一聊二维码扫描登录原理
扫二维码登录现在比较常见,比如微信、支付宝等 PC 端登录,并且好像每款 APP 都支持扫码登录,不搞个扫码登录都不好意思。作为技术人员,不知道您对这背后的实现逻辑是否敢兴趣,反正我是一直都对这背后实现好奇。最近刚好看到一个关于扫码登录原理的视频,于是就整理出来了这篇文章,希望对您有所帮助。本文共三个主题:什么是二维码。移动端基于 token 的认证机制。二维码扫码登录的原理。1、什...
2020-04-01 08:59:24
1841
原创 JUC 中提供的限流利器-Semaphore(信号量)
在 JUC 包下,有一个 Semaphore 类,翻译成信号量,Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore 跟锁(synchronized、Lock)有点相似,不同的地方是,锁同一时刻只允许一个线程访问某一资源,而 Semaphore 则可以控制同一时刻多个线程访问某一资源。Semaphore(信号量)并不是...
2020-03-31 09:27:57
855
原创 为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?
统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from tSQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢?为什么会变慢?想要得到答案就需要知道 MySQL 是如何统计总数量的,先说一个前提吧,count(*) 的具体实现是由存储引擎实现的,也就是说不同的存储引擎实现的方式不一样。标题:为什么...
2020-03-27 09:49:00
3630
3
原创 工作的本质是解决问题
不知道你是否会经常产生:感觉在公司技术上得不到提升,想跳槽的想法,但是你会发现一个有趣的规律,换了一家新公司,三五个月之后,你又会有同样的想法,它会进入到一个死循环中。任何一件事情,做过两三遍之后,都可以用粘贴复制来解决。对于一家公司来说,公司的业务是比较固定,它并不是为你量身定做的。当你的成长速度可能会优于公司的成长速度时,你需要静下心来沉淀自己,而不是通过跳槽来解决问题。但是在公司技术严重脱...
2020-03-14 10:30:54
4281
17
原创 使用消息中间件时,如何保证消息仅仅被消费一次?
消息中间件使用广泛,常用来削峰填谷、系统解耦、异步处理。异步处理可能是使用的最多的场景了,比如现在的技术博客网站,都采用积分制,用户发表一篇文章后,可以获取想要的积分,为了提升系统的性能,给用户加积分的操作可以异步处理,并不需要放在同步流程中。我们可以把用户ID,需要增加的积分封装成一条消息投递到消息系统中,异步处理加积分操作,由于这是发生在不同服务器之间,消息有可能投递失败、处理失败等问题,从...
2020-03-12 09:25:54
2926
4
原创 缓存穿透了怎么办?
在现在互联网架构中,几乎每个互联网项目都会引入缓存系统,比如 Redis、Memcached。来保护下游数据库和提升系统并发量。不管使用哪种缓存系统都有可能遇到缓存穿透的问题。缓存穿透是指在缓存系统中没有查询到数据,而不得不将请求打到数据库上查询的情况。当然缓存系统是不可避免的,少量的缓存穿透对系统也没有损害,不可避免的原因有以下几点:缓存系统的容量是有限的,不可能存储系统所有的数据,那么...
2020-03-10 09:17:37
1712
8
原创 MySQL 数据库的提速器-写缓存(Change Buffer)
写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操作缓存在 Change Buffer 中,这样就省去了从磁盘中读入这个数据页。将数据页从磁盘读入内存中涉及随机 IO 访问,这也是数据库里面成本最高的操作之一,而利用写缓存(Change Buffe...
2020-02-27 11:34:17
3356
原创 删库了,我们一定要跑路吗?
在工作中,我们误删数据或者数据库,我们一定需要跑路吗?我看未必,程序员一定要学会自救,神不知鬼不觉的将数据找回。在 mysql 数据库中,我们知道 binlog 日志记录了我们对数据库的所有操作,所以 binlog 日志就是我们自救的利器。接下来就来开启程序员自救之路。想要自救成功,binlog 这把利器一定要好,在自己之前,我们一定要确定我们有 binlog 这把利器,以下就是确保有 bi...
2020-02-23 17:46:05
54338
104
原创 做好一件事的三要素
做一件事很难,要做好一件事就更难了,影响的因素太多了。今天就谈一谈我认为要做好一件事情的三个基本要素,供大家参考。1、心态能否做好一件事,心态有着决定性作用。在做事的时候,必须切实行动,不能抱着试一试的心态,如果是这种心态,那么最终都会以失败而告终。试一试的心态更多的是一种借口,在还没有做之前,我们就给自己找好了退路,因为失败了,我只是试一试而已。所以做事情只有两个选择:做或者不做,并不存...
2020-02-19 20:25:54
9168
13
原创 一分钟简单了解 JSON Web Token
JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。今天我们就来简单的认识一下 JSON Web Token。JWT 认证和 session认证的区别首先需要说明 JSON Web Token 是可以用于认证的,那么就先来对比一下 JSO...
2020-02-14 08:50:41
2452
1
原创 聊一聊 MySQL 中的数据编辑过程中涉及的两阶段提交
MySQL 数据库中的两阶段提交,不知道您知道不?这篇文章就简单的聊一聊 MySQL 数据库中的两阶段提交,两阶段提交发生在数据变更期间(更新、删除、新增等),两阶段提交过程中涉及到了 MySQL 数据库中的两个日志系统:redo 日志和 binlog 文件。redo 日志前面已经介绍过了,就不再介绍了,简单的聊一聊 binlog 文件,binlog 是 MySQL server 层提供的二进制...
2020-02-03 12:51:12
3411
原创 聊一聊 MySQL 数据库中的那些锁
在软件开发中,程序在高并发的情况下,为了保证一致性或者说安全性,我们通常都会通过加锁的方式来解决,在 MySQL 数据库中同样有这样的问题,一方面为了最大程度的利用数据库的并发访问,另一方面又需要保证每个用户能以一致的方式读取和修改数据,就引入了锁机制。在 MySQL 数据库中,锁有很多种类型,不过大致可以分为三类:全局锁、表级锁、行级锁。这篇文章我们就简单的聊一聊这三种锁。全局锁全局锁是粒...
2020-02-01 16:46:07
5220
6
原创 聊一聊 InnoDB 引擎中的这些索引策略
在上一篇中,我们简单的介绍了一下 InnoDB 引擎的索引类型,这一篇我们继续学习 InnoDB 的索引,聊一聊索引策略,更好的利用好索引,提升数据库的性能,主要聊一聊覆盖索引、最左前缀原则、索引下推。覆盖索引覆盖索引是指在普通索引树中可以得到查询的结果,不需要在回到主键索引树中再次搜索。建立如下这张表来演示覆盖索引:mysql> create table T (ID int pr...
2020-01-29 08:32:09
2280
原创 聊一聊 InnoDB 引擎中的索引类型
索引对数据库有多重要,我想大家都已经知道了吧,关于索引可能大家会对它多少有一些误解,首先索引是一种数据结构,并且索引不是越多越好。合理的索引可以提高存储引擎对数据的查询效率。形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理。MySQL 数据库有很多种索引,每种存储引擎的索引都不太一样,这篇文章就介绍一下 InnoDB 引擎种的索引,在 InnoDB...
2020-01-21 16:18:21
5679
2
原创 MySQL 持久化保障机制-redo 日志
我们在 聊一聊 MySQL 中的事务及其实现原理 中提到了 redo 日志,redo 日志是用来保证 MySQL 持久化功能的,需要注意的是 redo 日志是 InnoDB 引擎特有的功能。为什么 InnoDB 引擎会引入 redo 日志作为中间层来保证 MySQL 持久化,而不是直接持久化到磁盘?我们先来看看《MySQL实战45讲》中提到的一个故事。在《孔乙己》这篇文章,酒店掌柜有一个粉板,...
2020-01-10 09:19:24
3848
1
原创 为什么TCP建立连接协议是三次握手,而关闭连接却是四次挥手呢?
看到了一道面试题:“为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?”,想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章,希望对你们有所帮助。TCP 连接我们先来补一下基础什么是 TCP 协议?传输控制协议( Transmission Control Protocol, TCP )是种面向连接、确保数据在端到端间可靠传输的协议。面向连...
2020-01-08 09:34:57
21579
10
原创 聊一聊 MySQL 中的事务及其实现原理
说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景:面试官:"事务的四大特性是什么?"我:"ACID,即原子性(Atomicity)、隔离性(Isolation)、持久性(Durability)、一致性(Consistency)!"面试官:"在 MySQL 数据库的 InnoDB 引擎是怎么实现这四大特性的?"我:"这个...这个....,还真没有了解过哎"面...
2020-01-03 10:34:33
4520
1
原创 select * from user 这条 SQL 语句,背后藏着哪些不可告人的秘密?
作为一名 Java开发人员,写 SQL 语句是常有的事,但是你知道 SQL 语句背后的处理逻辑吗?比如下面这条 SQL 语句:select * from user where id=1执行完这条语句后,我们就会得到 id 为 1 的用户信息。那么对于这一条 SQL 语句,MySQL服务器做了哪些处理呢?这篇文章我们就一起打卡 MySQL 数据库中对 SQL 语句的处理逻辑。了解 MySQL...
2019-12-31 09:28:33
5560
原创 熟悉这几道 Redis 高频面试题,面试不用愁
1、说说 Redis 都有哪些应用场景?缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。共享Session:对于一些依赖 session 功能的服务来说,如果需要从单机变成集群的话,可以选择 redis 来统一管理 session。消息队列系统:消息队列系统可以说是一个大型网站的必备基础组件,...
2019-12-26 10:39:12
8413
9
原创 一题算法|求随机数索引
题目描述给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。注意:数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。题目示例int[] nums = new int[] {1,2,3,3,3};Solution solution = new Solution(nums);// pick(3) 应该返回索引 2...
2019-12-25 15:37:13
2176
4
原创 一题算法|求最长和谐子序列
和谐子序列的定义和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1,也就是说我们需要找出比该元素大于或者相等的元素LeetCode 题目:给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度题目示例:输入: [1,3,2,2,5,2,3,7]输出: 5原因: 最长的和谐数组是:[3,2,2,2,3].解法一:暴力枚举法暴力枚举的思想很简单,也...
2019-12-24 14:33:17
1849
原创 职场中你忽略的细节,都是别人晋升的秘密
作为职场新人,在职场这门学问中,我们都还没有入门,这是我听完曹政老师的知识星球年终福利课《职场的真相》之后的感悟,曹政老师这门课针对的就是我们这样的职场新人,在课中曹政老师讲述了他自己当年在职场中所犯的错误并且指导年轻人该如何在职场中前行,虽然里面的不少观点在曹政老师的很多公众号文章中有提到过,但是经过曹政老师整理和解读之后,收获很多,这两天我也是反复的听,希望自己可以多吸收一点,在职场中走的顺利...
2019-12-23 10:09:55
5639
1
原创 借 redis cluster 集群,聊一聊集群中数据分布算法
Redis Cluster 集群中涉及到了数据分布问题,因为 redis cluster 是多 master 的结构,每个 master 都是可以提供存储服务的,这就会涉及到数据分布的问题,在新的 redis 版本中采用的是虚拟槽分区技术来解决数据分布的问题,关于什么是虚拟槽分区技术我们后面会详细的介绍。在集群中除了虚拟槽分区技术之外,还有几种数据分布的算法,比如哈希算法,一致性哈希算法,这篇文章...
2019-12-13 09:41:20
2002
原创 深入解析 ConcurrentHashMap 实现内幕,吊打面试官?没问题
在开发中,我们经常使用 HashMap 容器来存储 K-V 键值对,但是在并发多线程的情况下,HashMap 容器又是不安全的,因为在 put 元素的时候,如果触发扩容操作,也就是 rehash ,就会将原数组的内容重新 hash 到新的扩容数组中,但是在扩容这个过程中,其他线程也在进行 put 操作,如果这两个元素 hash 值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会...
2019-12-09 16:29:33
2384
6
原创 三分钟带你入门 redis 高可用架构之哨兵
什么是哨兵?哨兵(Sentinel)是 redis 的高可用性解决方案,前面我们讲的主从复制它是高可用的基础,需要人工介入才能完成故障转移,哨兵可以解决这个问题,在主从复制情况下,当主节点发生故障时,哨兵可以自动的发现故障并且完成故障转移,实现真正的 redis 高可用。在哨兵集群中,哨兵会监视所有的 redis 服务器和其他 sentinel 节点状态,来保证 redis 的高可用。哨兵的搭...
2019-12-05 09:18:36
2400
原创 Java 浅拷贝、深拷贝,你知多少?
这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区。这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助。在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值、浅拷贝、深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存在一些误区,这篇文章会详细的介...
2019-12-04 11:10:42
6476
17
原创 一文带你深入了解 redis 复制技术及主从架构
主从架构可以说是互联网必备的架构了,第一是为了保证服务的高可用,第二是为了实现读写分离,你可能熟悉我们常用的 MySQL 数据库的主从架构,对于我们 redis 来说也不意外,redis 数据库也有各种各样的主从架构方式,在主从架构中会涉及到主节点与从节点之间的数据同步,这个数据同步的过程在 redis 中叫做复制,这在篇文章中,我们详细的聊一聊 redis 的复制技术和主从架构 ,本文主要有以下...
2019-11-27 17:28:50
2005
3
原创 一文带你深入了解 Redis 的持久化方式及其原理
Redis 提供了两种持久化方式,一种是基于快照形式的 RDB,另一种是基于日志形式的 AOF,每种方式都有自己的优缺点,本文将介绍 Redis 这两种持久化方式,希望阅读本文后你对 Redis 的这两种方式有更加全面、清晰的认识。RDB 快照方式持久化先从 RDB 快照方式聊起,RDB 是 Redis 默认开启的持久化方式,并不需要我们单独开启,先来看看跟 RDB 相关的配置信息:####...
2019-11-19 16:20:16
2165
原创 详细讲解 Redis 的两种安装部署方式
Redis 是一款比较常用的 NoSQL 数据库,我们通常使用 Redis 来做缓存,这是一篇关于 Redis 安装的文章,所以不会涉及到 Redis 的高级特性和使用场景,Redis 能够兼容绝大部分的 POSIX 系统,例如 Linux、OS X 等,但是很遗憾不支持在 Windows 上安装,当然如果你需要在 windows 下安装 redis 的话,也是可以的,微软公司的开源技术组在 Gi...
2019-11-18 16:07:20
2090
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人