摘要:
引言 在深入介绍Seata的实现之前,我们先在一个较高的层面一览Seata的整体设计思想。 一、设计方案 整体架构 首先,很自然的,我们可以把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本 阅读全文
摘要:
一、概述 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 二、使用案例 可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取 阅读全文
摘要:
一、简介 负载均衡(Load Balance):指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够 阅读全文
摘要:
JUC中的同步器三个主要的成员:CountDownLatch、CyclicBarrier和Semaphore。这三个是JUC中较为常用的同步器,通过它们可以方便地实现很多线程之间协作的功能。 一、概述 CountDownLatch是基于AQS实现,当构建count对象时,传入的值其实就会赋值给AQS 阅读全文
摘要:
一、概述 ArrayList是一种变长的集合类,基于定长数组实现,所以其可以保证在\(O(1)\)复杂度下完成随机查找操作。 ArrayList允许空值和重复元素,当往ArrayList中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个更大的数组。ArrayList是非线程安全类,并 阅读全文
摘要:
一、概述 Exchanger是一个用于线程间协作的工具类,Exchanger用于进行两个线程间(只能两个)的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exch 阅读全文
摘要:
一、概述 CyclicBarrier基于ReentrantLock和Condition等待唤醒的功能实现的,在构建CyclicBarrier时,会将count-1,操作count值是直接使用ReentrantLock来保证线程安全性,如果count不为0时,则添加condition队列中,如果等于0 阅读全文
摘要:
一、简介 并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Collections.synchronizedMap()以及Hashtable,ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求。 Concurre 阅读全文
摘要:
一、简介 Phaser(阶段)是java 7引入的新的并发API,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,但是必须上一个阶段的任务都完成了才可以执行下一个阶段的任务。所以Phaser特别适合使用在重复执行或者重用的情况。 这种场景虽然使用Cycli 阅读全文
摘要:
一、概述 Jdk 8新增的Stream,配合Lambda,给操作集合(Collection)提供了极大的便利。 那么什么是Stream?Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。 Stream可以由数组或集合创建, 阅读全文
摘要:
在io.netty.example包下,有很多Netty源码案例,可以用来分析。用源码分析的方式走一下Netty(服务器)的启动过程,更好的理解Netty的整体设计和运行机制。源码需要剖析到Netty调用doBind方法,追踪到NioServerSocketChannel的doBind。并且要Deb 阅读全文
摘要:
一、Netty概述 1.1 原生NIO存在的问题 NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉Java多线程编程,因为NIO编程涉及到Reactor模式, 阅读全文
摘要:
一、概述 I/O模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。Java共支持3种网络编程模型I/O模式:BIO、NIO、AIO。 Java BIO:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行 阅读全文
摘要:
# 一、分布式事务 > 首先奉上一张关于事务的相关概念图,给大家做个总览: ![20210710220330858.png](https://img2022.cnblogs.com/blog/2745643/202205/2745643-20220505001541059-632293431.png 阅读全文
摘要:
一、概述 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。 官网 Seata概述 下载中心 示例 1.1 简介 在Seata开源之前,Seata对应的内部版本在阿里经济体内部 阅读全文
摘要:
一、前言 在很多业务情况下,我们都会在系统中加入Redis缓存做查询优化,使用es做全文检索。 如果数据库数据发生更新,这时候就需要在业务代码中写一段同步更新Redis的代码。这种数据同步的代码跟业务代码糅合在一起会不太优雅,能不能把这些数据同步的代码抽出来形成一个独立的模块呢,答案是可以的。 二、 阅读全文
摘要:
Redisson是一个用于连接redis的java客户端,相对于jedis,是一个采用异步模型,大量基于netty promise编程实现的客户端框架。是更高性能的第三方库。所以,这里推荐大家使用Redission替代jedis。 一、简介 Redisson是一个在Redis的基础上实现的Java驻 阅读全文
摘要:
一、跨JVM的线程安全问题 在单体的应用开发场景中,在多线程的环境下,涉及并发同步的时候,为了保证一个代码块在同一时间只能由一个线程访问,我们一般可以使用synchronized语法和ReetrantLock去保证,这实际上是本地锁的方式。 也就是说,在同一个JVM内部,大家往往采用synchron 阅读全文
摘要:
一、简述 1.1 什么是ThreadLocal? ThreadLocal类顾名思义可以理解为线程本地变量也有叫线程本地存储。作用是提供线程内的局部变量,也就是说如果定义了一个ThreadLocal,每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的。它提供了一种将可变数据通过每 阅读全文
摘要:
一、JVM简介 JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java虚拟机主要由字节码指令集、寄存器、栈、垃圾回收堆和存储方法域等构成。JVM屏蔽了与具体操作系统平台相关的信息,使Java程 阅读全文