摘要:
关于线程池的详细分析,具体请看这篇帖子:https://www.cnblogs.com/reecelin/p/12334107.html 在开始之前,我们还是再来复习一下线程池的工作流程吧,如下所示: 现在,我们可以根据上面的流程简单写个线程池,如下: public interface Thread 阅读全文
摘要:
前言 提起Redis,我们经常会说其底层是一个单线程模型,但这是不严谨的。Redis单线程指的是网络请求模块只使用了一个线程来分发所有网络请求,其他模块该使用多线程,如AOF时的BIGREWRITE时,仍会使用了多线程处理。既然是单线程模型,那么就不需要CPU频繁切换上下文线程了,显然CPU就不是R 阅读全文
摘要:
前言 之前自学网络IO相关知识的笔记。 基础概念 正式开始之前,需要铺垫一些基本概念,以免接下来看到一脸懵逼。 我们都知道,在操作系统中,CPU负责执行指令,这些指令有些来自应用程序,有些是底层系统的自调用。有些指令是非常危险的,如清除内存,网络连接等等,如果错误调用的话有可能导致系统崩溃。因而CP 阅读全文
摘要:
前言 在之前的Redis使用中缓存穿透、缓存雪崩等问题总结中提到过,缓存穿透的解决办法之一就是使用布隆过滤器,BloomFilter来过滤掉无效请求。今天我们来了解一下布隆过滤器。 BloomFilter原理 BloomFilter是一种概率型数据结构,它由一个长度为m的二进制向量(位数组)和k个哈 阅读全文
摘要:
前言 日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息。MySQL中日志类型有很多种,但对于开发来说,最常见和最重要的就是binlog、redolog和undolog。本篇文章主要对这三种日志类型做一个简要的介绍。 前置知识 简单说一下,逻辑日志和物理日志的区别吧 逻辑日志:可 阅读全文
摘要:
前言 在多线程开发中,线程池是个利器,可以帮助我们管理线程和复用线程。而在线程池中,用来保存线程和任务的数据结构就是队列,如newFixedThreadPool和newSingleThreadExecutor这两个线程池使用的LinkedBlockingQueue队列,newCachedThread 阅读全文
摘要:
前言 MySQL在REPEATABLE READ级别解决了幻读问题,解决方案有两种,一种是MVCC版本控制链,具体可以参考这个,MVCC 多版本控制链,还有就是通过加锁的方式。这篇文章简要介绍一下MySQL是如何通过加锁来解决幻读问题的。 准备工作 还是一样,先创建一张表,如下所示: CREATE 阅读全文
摘要:
前言 讲解多版本控制之前,先说一下结论吧: MVCC多版本控制链指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SELECT操作时访问记录的版本链的过程,这样子可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能; READ COMMI 阅读全文
摘要:
前言 ArrayList可以说是日常开发中最常用到的一个数据结构了,今天我们开始撸一下它的源码。 整体结构 ArrayList的继承关系如下所示: 需要注意到ArrayList实现了RandomAccess这个接口,其源码如下: public interface RandomAccess { } 可 阅读全文
摘要:
前言 前面分析了jdk8版本的HashMap,虽然在新版本的jdk中解决了HashMap之前存在的死锁问题,但是该版本的HashMap还是只能用于单线程情况下。多线程环境下还是要使用ConcurrentHashMap来解决并发问题。 ConcurrentHashMap的继承关系如下所示: Concu 阅读全文