自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分库分表(一)--分库分表基础

目录一、为什么要分库分表:二、分库分表如何拆分:1、垂直拆分:2、水平拆分:三、分库分表的方式:1、水平分库:概念:场景:分析:2、水平分表:概念:场景:分析:3、垂直分库:概念:场景:分析:4、垂直分表:概念:场景:分析:四、分库分表中间件:1、cobar:2、TDDL:3、atlas:4、sharding-jdbc:5、mycat:6、综合考虑:五、分库分表带来的问题:1、事务一致性问题:1...

2022-03-03 08:46:00 958

原创 分布式唯一ID(四)--Leaf-Snowflake方案

目录一、背景:二、Leaf-snowflake启动步骤:三、弱依赖ZooKeeper:四、解决时钟问题:1、流程:2、代码实现:3、表现:五、Leaf现状:本文来自官方文档的简单总结,非原创!!!Leaf:美团分布式ID生成服务开源一、背景:Leaf-segment方案可以生成趋势递增的ID,同时ID号是可计算的,不适用于订单ID生成场景,比如竞对在两天中午12点分别下单,通过订单...

2022-03-01 20:31:00 416

原创 分布式唯一ID(三)--Leaf-Segment数据库方案

目录一、改进:二、数据库表设计:字段说明:优势:架构图:三、优点:四、缺点:五、双buffer优化:实现图:六、高可用:本文来自官方文档的简单总结,非原创!!!Leaf:美团分布式ID生成服务开源一、改进:原始方案每次获取ID都要读写数据库,数据库压力比较大。每次获取一个号段的值(step决定大小),用完之后再去数据库获取新的号段,很大减轻数据库的压力。各个业务不同的需求用biz_t...

2022-03-01 20:24:00 230

原创 分布式唯一ID(二)--基于Snowflake算法生成唯一ID

目录一、背景:二、特点:三、代码实现:四、多机房部署:五、时钟回拨:1、举个栗子:2、解决方案:2.1. 关闭时钟同步:2.2. 记录上一次生成ID的时间:2.3. 暂停对外提供服务:2.4. 内存中维护最近几秒生成的ID:2.5. 兜底:3、问题:3.1. 解决方案一:一、背景:SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:1位:不使用,二进制中最高位...

2022-03-01 00:38:00 336

原创 分布式唯一ID(一)--常见的分布式唯一ID生成方案

目录一、背景:二、常见的分布式唯一ID生成方案:1、数据库自增主键:优点:缺点:适用场景:2、UUID:优点:缺点:适用场景:3、Twitter开源的SnowFlake方案:核心思想:优点:缺点:适用场景:4、Redis自增机制:核心思想:优点:缺点:适用场景:5、时间戳 + 业务id:1、业务背景:2、实现:3、优点:4、缺点:5、适用场景:6、flickr(雅虎旗下的图片分享平台)的数据库唯...

2022-02-28 16:39:00 604

原创 Java集合(七)--基于jdk1.8的HashMap源码

一、背景:HashMap在开发中经常用,面试源码方面也会经常问到,今天总结一下,包括在后面有相关面试题。本文不会对红黑树代码由太多深入研究,特别是删除方面太复杂,面试也不会问到,知道红黑树基本实现原理就可以了。源码基于jdk1.8,我们都知道1.8版本的HashMap有很大改变,通过数组+链表+红黑树实现。二、图例:关于链表和红黑树相关内容,可以参考:Java数据结构和...

2022-02-19 16:15:00 51

原创 系统高可用需要考虑哪些方面

目录一、背景:二、限流:1、压测:2、压测最主要解决的问题:3、压测之后:4、如何限流:三、熔断:1、为什么需要熔断:2、使用场景:3、实现:四、降级:1、实现降级:五、资源隔离:1、对比:六、报警:1、应用告警:2、业务告警:3、微服务指标告警:4、慢SQL告警:七、监控:1、业务数据看板:2、应用监控:3、系统指标:4、JVM指标:5、集成业务大盘:6、总结:一、背景:在大部分系统中,特...

2022-02-08 20:55:00 472

原创 如何保证幂等性

目录一、背景:二、场景:1、前端重复提交:2、接口超时重试:3、消息重复消费:三、幂等性方案:1、业务表唯一索引:2、状态流转控制:3、乐观锁版本号:4、去重:5、分布式锁:一、背景:分布式场景下,接口的开发大都需要保证幂等性。幂等性:一个接口被调用,不管几次,产生一样的效果,一样返回结果。接口调用过程中,很可能因为网络等原因进行重试调用,如果不能保证幂等性,那就完犊子了。...

2022-01-25 15:21:00 499

原创 分布式锁(二)--Redis实现分布式锁

目录一、背景:二、Redis实现可靠性分布式锁的条件:三、加锁思路:四、释放锁思路:1、为什么使用lua脚本:2、为什么使用随机值呢?五、代码实现:六、存在的问题:七、Redisson实现分布式锁:1、背景:2、加锁:看门狗3、解锁:4、Redis集群故障,分布式锁是否有效?5、RedLock算法具体实现:一、背景:前面了解了分布式锁,做了最简单的入门了解,分布式锁(一)--基础企业开发中使...

2022-01-24 15:52:00 73

原创 分布式锁(一)--基础

目录一、背景:二、举个栗子:1、不使用分布式锁:2、使用分布式锁:3、总结:三、实现方式:四、Redis和ZK实现对比:1、消耗:2、实现复杂度:3、安全性:4、性能:5、总结:五、业务场景:1、无法通过唯一索引保证幂等性的插入:2、不需要并发调用的接口访问:3、总结:一、背景:如果系统就是一个单体系统,不需要考虑这些问题,最多使用synchronized相关的锁解决并发问题。但是一个...

2022-01-22 14:15:00 59

原创 并发和多线程(十六)--ReentrantLock源码解析

目录类定义:Lock:Sync:tryRelease():FairSyncFairSync前面刚学习了AQS的基本原理,主要通过两个队列实现功能(同步队列+等待队列,前者是双向链表,实现加锁和解锁,后者是单向链表,用做同步协作,阻塞、唤醒),正好可以趁热打铁,了解一下ReentrantLock的源码,有了AQS的基础,阅读ReentrantLock的源码是非常简单的,如果没有了解AQS原理的同...

2022-01-22 14:06:00 178

原创 并发和多线程(二十)--LinkedBlockingQueue源码解析

目录类定义QueueBlockingQueue成员变量构造函数offer()put()take()enqueue and dequeuepeek()阻塞队列在日常开发中直接使用比较少,但是在很多工具类或者框架中有很多应用,例如线程池,消息队列等。所以,深入了解阻塞队列也是很有必要的。所以这里来了解一下LinkedBlockingQueue的相关源码,从命名可以看出来是由链表实现的数据结构。类定...

2022-01-09 10:01:00 248

原创 并发和多线程(十九)--ConcurrentHashMap源码解析(jdk1.8)

目录成员变量构造函数NodeTreeNodeTreeBinForwardingNodeputVal 添加initTable 初始化treeifyBintryPresize()transfer()get获取在并发工具类和并发集合中,可能最复杂的就是jdk1.8+的ConcurrentHashMap源码,相比jdk1.8-,已经抛弃了Segment分段锁的实现方式,采用了Synchronized、...

2022-01-09 10:00:00 303

原创 并发和多线程(十八)--CountDownLatch、Semaphore和CyclicBarrier源码解析

目录简述:CountDownLatchSemaphore:CyclicBarrier简述:CountDownLatch、Semaphore和CyclicBarrier都是并发编程常用、好用的工具类,不需要开发人员使用底层的api,例如join(),可以通过CountDownLatch代替,开箱即用,减少使用底层api出错的可能,而且功能更加强大,CountDownLatch和Semaphore...

2022-01-09 09:59:00 61

原创 并发和多线程(十七)--CopyOnWriteArrayList源码解析

目录CopyOnWrite:类注释:类属性:添加System.arraycopy()获取删除修改批量删除关于迭代:总结:我们肯定都使用过ArrayList,但是多线程或并发环境下,ArrayList作为共享变量被访问,是线程不安全的。我们可以选择自己加锁或Collections.synchronizedList()去实现一个线程安全的容器。除此之外,我们还可以使用今天要学习的CopyOnWri...

2022-01-09 09:58:00 182

原创 并发和多线程(十五)--AbstractQueuedSynchronizer共享锁和Condition条件队列

目录acquireShared()获取共享锁:doAcquireShared()setHeadAndPropagate():条件队列:signal()doSignal()transferForSignal()在上篇博客中了解了排他锁的基本源码实现,所以现在我们学习下共享锁的源码,二者的源码实现大部分都是相同的,而且了解了排他锁的原理之后,我们现在阅读共享锁的源码会更加得心应手。排他锁:当前锁...

2022-01-09 09:53:00 206

原创 分布式事务(二)--常见解决方案

目录一、TCC方案1、基本流程:2、使用场景:二、本地消息表1、基本流程:2、总结:三、可靠消息最终一致性方案1、补偿:2、总结:3、使用场景:四、异步处理:五、我司内部订单系统实现方案:1、背景:一、TCC方案1、基本流程:1)Try阶段:对各个服务的资源做检测以及对资源进行锁定。2)Confirm阶段:在各个服务中执行实际的操作。3)Cancel阶段:如果任何一个服务的业务方法执...

2022-01-09 09:39:00 47

原创 ACID、MVCC、隔离级别

目录一、事务的ACID:1、Atomic:原子性2、Consistency:一致性3、Isolation:隔离性4、Durability:持久性二、事务隔离级别1、读未提交--脏读,Read Uncommitted:2、读已提交--不可重复读,Read Committed:3、可重复读--幻读,Read Repeatable:4、串行化:Seriaizable5、不可重复读和幻读的区别:三、My...

2022-01-09 09:27:00 51

原创 分布式事务(一)--理论基础

目录一、写在开始:二、微服务、分布式、集群的区别:三、背景:四、分布式环境下,存在的一致性问题1、背景:2、异常分析:五、柔性事务--CAP1、一致性1.1、一致性分类:2、可用性2.1、可用性级别:3、分区容忍性3.1、分区partition/network partition3.2、不具备分区容忍性4、CAP => CP or AP5、保证CP6、AP6.1、场景:六、柔性事务--BA...

2022-01-09 09:24:00 78

原创 线程池ThreadPoolExecutor源码解析

线程池简单来说是一组可以执行任务的空闲线程,可以用来任务调度。线程池是并发内容相当重要的一部分,无论是工作还是面试的时候。所以需要对其有一定程度的了解,日常开发中一般使用Executors就可以了,但是对一些特殊需求需要去定制化参数,所以除了分析源码之外,lz在最后也会简单说下在一些场景下,通过修改参数来达到目的。ThreadPoolExecutor类图从这张类图可以看到,ThreadPoo...

2020-01-11 12:03:25 171

原创 LinkedBlockingQueue源码解析

阻塞队列在日常开发中直接使用比较少,但是在很多工具类或者框架中有很多应用,例如线程池,消息队列等。所以,深入了解阻塞队列也是很有必要的。所以这里来了解一下LinkedBlockingQueue的相关源码,从命名可以看出来是由链表实现的数据结构。类定义 public class LinkedBlockingQueue<E> extends AbstractQueue<E&...

2020-01-05 18:11:01 203

原创 ConcurrentHashMap源码解析(jdk1.8)

在并发工具类和并发集合中,可能最复杂的就是jdk1.8+的ConcurrentHashMap源码,相比jdk1.8-,已经抛弃了Segment分段锁的实现方式,采用了Synchronized、CAS、volatile来实现一个线程安全的容器,是HashMap线程安全版本。关于数据结构方面,和HashMap很相似了,但是有更多内部类,我们在下面就可以看到。如果想要了解HashMap相关源码,可以参...

2020-01-05 08:09:26 159

原创 HashMap源码解析(jdk1.8)

HashMap在开发中经常用,而且面试的时候肯定也会被问到,所以了解源码是很有必要的,能够让我们更好的使用HashMap,今天总结一下,在最后面会有相关面试题。本文不会对红黑树代码由太多深入研究,特别是删除方面太复杂,我们知道红黑树的特点和基本实现原理差不多就可以了,这里推荐先学习2-3树,然后学习红黑树就会水到渠成,然后能够手写实现红黑树就挺好的。这里HashMap源码基于jdk1.8,我们都...

2020-01-01 16:32:23 260

原创 CopyOnWriteArrayList源码解析

我们肯定都使用过ArrayList,但是多线程或并发环境下,ArrayList作为共享变量被访问,是线程不安全的。我们可以选择自己加锁或Collections.synchronizedList()去实现一个线程安全的容器。除此之外,我们还可以使用今天要一起学习的CopyOnWriteArrayList。CopyOnWrite是一种策略,表示在使用的时候,将共享内容拷贝一份进行修改,修改完成之后,...

2020-01-01 14:53:58 365

原创 CountDownLatch、Semaphore和CyclicBarrier源码解析

简述:CountDownLatch、Semaphore和CyclicBarrier都是并发编程常用、好用的工具类,不需要开发人员使用底层的api,例如join(),可以通过CountDownLatch代替,开箱即用,减少使用底层api出错的可能,而且功能更加强大,CountDownLatch和Semaphore直接实现了AQS进而实现功能,而CyclicBarrier通过ReentrantLoc...

2019-12-23 14:40:00 331

原创 ReentrantLock源码解析

前面刚学习了AQS的基本原理,主要通过两个队列实现功能(同步队列+等待队列,前者是双向链表,实现加锁和解锁,后者是单向链表,用做同步协作,阻塞、唤醒),正好可以趁热打铁,了解一下ReentrantLock的源码,有了AQS的基础,阅读ReentrantLock的源码是非常简单的,如果没有了解AQS原理的同学,可以参考:AbstractQueuedSynchronizer源码(上)–排他锁Abs...

2019-12-22 21:57:05 394

原创 AbstractQueuedSynchronizer源码(下)--共享锁和Condition条件队列

在上篇博客中了解了排他锁的基本源码实现,所以现在我们学习下共享锁的源码,二者的源码实现大部分都是相同的,而且了解了排他锁的原理之后,我们现在阅读共享锁的源码会更加得心应手。排他锁:当前锁只能被一个线程所持有,也只能有一个线程释放。共享锁:当前锁可以被多个线程持有,并且可以设置持有锁的线程数量。acquireShared()获取共享锁://共享锁获取锁public final vo...

2019-12-21 21:02:27 307

原创 线程安全、synchronized、CAS、Happen-before原则简介

一、线程安全性:当多个线程访问一个一个对象或者方法的时候,在编写代码的时候,不需要进行额外的处理,就像在单线程环境下一样处理,此时如果还能得到正确的结果,就可以说是线程安全。如果在编写代码的时候,需要进行一些同步的操作(例如使用Synchronized关键字),或者考虑多线程运行的调度和切换(例如read()的时候不能同时set()),那就是线程不安全。无状态的对象一定是线程安全的,例如大部分...

2019-12-21 16:22:25 556

原创 java内存模型JMM

本文参考慕课网相关视频和博客https://mp.weixin.qq.com/s/tV0MfDdJqGwGMHCIkqnAgA,图也是这个博客的,这篇只是自己的简单总结,想要深入理解可以访问这两块内容。一、内存模型定义java memory model(简称JMM),这是一个抽象的概念,不是真实存在的。它是一种规范,利用这些规范,更方便的开发多线程程序。如果没有JMM,Java代码运行在不同的...

2019-12-21 16:05:48 227

原创 并发和多线程(六)--实现两个线程从0-100交替打印

分享一道多线程面试题,只是拿来练手的,这里通过两种方式去实现0-100交替打印,大家无聊的话,可以瞅两眼。一、Synchronized实现:public class PrintNumberIncrInSynchronized { private static int number; private static final Object object = new Object...

2019-12-21 16:03:01 479

原创 并发与多线程(五)--线程相关属性和线程异常处理

1、线程id和name线程id是线程的唯一标识,不可修改,而线程名称是可以修改的。复制代码public static void main(String[] args) { Thread thread = new Thread(); System.out.println("主线程ID为:"+Thread.currentThread().getId()); System....

2019-12-21 15:59:59 140

原创 并发与多线程(四)--wait、notify、notifyAll、sleep、join、yield使用详解

wait、notify、notifyAll这三个方法都是属于Object的,Java中的类默认继承Object,所以在任何方法中都可以直接调用wait(),notifyAll(),notify(),static方法也一样,new一个对象再调用。这三个方法必须是在获取到monitor锁的前提下使用,也就是使用ReentrantLock这类锁是不行的,只能是synchronized关键字内部,否则会...

2019-12-21 15:46:40 219

原创 并发与多线程(三)--验证线程的生命的生命周期/状态

43432432

2019-12-21 15:29:50 181

原创 并发与多线程(二)--启动和中断线程(Interrupt)的正确姿势

启动线程:从一个最基本的面试题开始,启动线程到底是start()还是run()?Runnable runnable = () -> System.out.println(Thread.currentThread().getName());Thread thread = new Thread(runnable);thread.run();thread.start();结果:ma...

2019-12-21 15:15:23 313

原创 并发与多线程(一)--创建线程的方式

多线程这个概念,离我们很近,是因为面试的时候无论是笔试还是面试肯定会问到,只是深浅的区别。而工作中只有一些特殊的场景我们才会用到多线程的内容(当然互联网等公司除外)甚至有些开发人员从来没有用过多线程,所以可能又离得很远。但是我们总能在一些大厂包括很普通的公司的面试要求中看到IO、多线程、并发等概念,所以除非你没想过在技术的路上去发展,否则这些是必须掌握的,也是Java的基础。我们总是开玩笑的说,...

2019-12-21 14:54:54 111

原创 AbstractQueuedSynchronizer源码(上)--排他锁

AbstractQueuedSynchronizer简称为AQS,AQS是ReentrantLock、CountdownLatch、CycliBarrier等并发工具的原理/基础,所以了解AQS的原理对学习J.U.C包很重要,本篇博客主要学习排他锁的加锁和解锁过程,而共享锁的部分将会在下一篇博客中学习。基本原理:1.AQS中包含两种队列(FIFO),同步队列+条件队列,底层都是双向链表,也就...

2019-12-21 14:42:20 234

原创 并发和多线程(十四)--AbstractQueuedSynchronizer排他锁基本原理

  AbstractQueuedSynchronizer简称为AQS,AQS是ReentrantLock、CountdownLatch、CycliBarrier等并发工具的原理/基础,所以了解AQS的原理对学习J.U.C包很重要,本篇博客主要学习排他锁的加锁和解锁过程,而共享锁的部分将会在下一篇博客中学习。基本原理:  1.AQS中包含两种队列(FIFO),同步队列+条件队列,底层都是双向链...

2019-12-19 18:14:00 42

原创 设计模式(二)--单例模式

  单例模式是最常见的设计模式,也是项目中或者框架中应用比较广泛的设计模式,今天一起复习的一下单例模式的几种写法。单例模式优点:  1.保证只有一个实例,所以可以节省内存和计算。  2.有些场景下,可以保证结果正确。  3.方便管理。使用场景:  1.无状态的工具类,例如日期工具类,字符串工具类等。  2.全局信息类。恶汉模式一:不推荐public class Single...

2019-12-12 06:27:00 32

原创 并发和多线程(五)--线程相关属性和线程异常处理

1、线程id和name  线程id是线程的唯一标识,不可修改,而线程名称是可以修改的。public static void main(String[] args) { Thread thread = new Thread(); System.out.println("主线程ID为:"+Thread.currentThread().getId()); System.o...

2019-10-27 21:37:00 64

原创 并发和多线程(四)--wait、notify、notifyAll、sleep、join、yield使用详解

wait、notify、notifyAll  这三个方法都是属于Object的,Java中的类默认继承Object,所以在任何方法中都可以直接调用wait(),notifyAll(),notify(),static方法也一样,new一个对象再调用。这三个方法必须是在获取到monitor锁的前提下使用,也就是使用ReentrantLock这类锁是不行的,只能是synchronized关键字内部,...

2019-10-24 14:01:00 97

空空如也

空空如也

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

TA关注的人

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