随笔分类 -  Java

Java
摘要:用户确认支付后,支付系统异步调用交易系统,交易系统更新交易状态,通知商家发货。如果交易系统超时未响应支付系统,支付系统会进行重试。有可能这时交易系统已经通知商家发货,这次的重试会让商家发货两次,这是不可以接受的。 这时,需要引入一个防重操作,例如,每次更新交易状态,先查询是否是初始状态,如果是,就更 阅读全文
posted @ 2021-11-03 21:37 csgopher 阅读(577) 评论(0) 推荐(0)
摘要:结构演进 早起JDK版本中,ThreadLocal内部结构是一个Map,线程为key,线程在“线程本地变量”中绑定的值为Value。每一个ThreadLocal实例拥有一个Map实例。(Key是线程,Value是值) JDK8中,ThreadLocal内部结构发生了演进,虽然还是Map,但是拥有者变 阅读全文
posted @ 2021-10-24 15:12 csgopher 阅读(355) 评论(2) 推荐(0)
摘要:类图概述 由类图可以看出,L是单向链表实现的,有两个ReentrantLock实例用来控制元素入队和出队的原子性,takeLock用来控制只有一个线程可以从队头获取元素,putLock控制只有一个线程可以从队尾添加元素。notEmpty和notFull是条件变量,内部有条件队列用来存放进队和出队被阻 阅读全文
posted @ 2021-10-24 13:37 csgopher 阅读(142) 评论(0) 推荐(0)
摘要:AQS简述 AQS是一个FIFO的双向队列,队列元素类型为Node(也就是Thread)。AQS有一个state属性,ReentrantLock可以用来便是当前线程获取锁的可重入次数;对于samaphore来说,state表示当前可用信号的个数;对于CountDownLatch,state表示计数器 阅读全文
posted @ 2021-10-20 23:02 csgopher 阅读(218) 评论(0) 推荐(0)
摘要:JUC的线程池架构 1.Executor Executor是Java异步任务的执行者接口,目标是执行目标任务。Executor作为执行者角色,目的是提供一种将“任务提交者”与“任务执行者”分离的机制。它只有一个函数式方法: public interface Executor { void execu 阅读全文
posted @ 2021-10-17 19:10 csgopher 阅读(360) 评论(0) 推荐(0)
摘要:线程的启动和运行 方法一:使用start()方法:用来启动一个线程,当调用start方法后,JVM会开启一个新线程执行用户定义的线程代码逻辑。 方法二:使用run()方法:作为线程代码逻辑的入口方法。run方法不是由用户程序来调用的,当调用start方法启动一个线程之后,只要线程获得了CPU执行时间 阅读全文
posted @ 2021-10-16 18:06 csgopher 阅读(425) 评论(0) 推荐(0)
摘要:幂等性是什么? 一次接口调用和多次接口调用都能得到与预期相符的结果。 怎么解决? 传统方法:代码增加前置判断,但是这样工作量太大了。 我们需要一种无侵入的幂等解决方案。 构建幂等表示通用的解决方案 幂等表设计 每次在请求头部放一个RequestId(保证唯一的),通过网关检查RequestId,幂等 阅读全文
posted @ 2021-10-08 23:22 csgopher 阅读(364) 评论(0) 推荐(0)
摘要:‌介绍 一阶段:事务协调者通知每一个服务处理本地事务,每个服务开始处理但是不会提交事务,处理完毕后告知协调者。 二阶段:协调者收到所有服务的消息后通知他们提交事务。 ‌重要角色 事务管理器(TM),决定什么时候全局提交or回滚。(司令官) 事务协调者(TC),负责通知命令的中间件seata-serv 阅读全文
posted @ 2021-10-04 21:11 csgopher 阅读(592) 评论(0) 推荐(0)
摘要:HashMap 存储结构 HashMap是数组+链表+红黑树(1.8)实现的。 (1)Node[] table,即哈希桶数组。Node是内部类,实现了Map.Entry接口,本质是键值对。 下图链表中的Node节点 (2)Node[] table初始化长度为16,负载因子是0.75,threshol 阅读全文
posted @ 2021-09-27 21:22 csgopher 阅读(268) 评论(0) 推荐(0)