- 博客(70)
- 收藏
- 关注
原创 全链路追踪必备组件之 TransmittableThreadLocal 详解
ThreadLocal 线程传递 & TransmittableThreadLocal 源码解析文章目录ThreadLocal 线程传递 & TransmittableThreadLocal 源码解析InheritableThreadLocal缺点RunnableWrapper/ CallableWrapperDelegaingExecutorTransmittableThrea...
2020-04-18 20:53:40 1173
原创 Activiti7 工作流非原流程终止
现在要求已经开启的流程,目前停留在 node1,可以提前终止。正常工作流,需要经过 node1、node2 才能结束。流程图需要体现这个分支流程(是正常业务应该关心的流转)后续根据条件,正确提交即可,可以正常流转。工作流模型改动有良好的版本管理和上线流程;下面分析一下这些方式的应用场景及优缺点。一次性流程关闭,无业务数据修复。
2023-04-13 17:00:21 2177
原创 SpringCloudGateway、zuul 服务网关调研概览
网关技术对比cloud-netflix-zuul(zuul 1.x)Spring Cloud GatewayZuul 2.xcloud-netflix-zuul(zuul 1.x)Spring Cloud GatewayZuul 2.x维护&社区停止更新,维护状态,Spring 社区活, 官方文档偏少持续,社区活跃,中英文文档都有资料有限,基本都在 Netflix 官方,英文文档生态Cloud 生态,新版本不再支持(只剩 Eureka)Cloud
2022-01-07 18:05:00 525
原创 部分 MP4 视频在谷歌浏览器无法播放
部分 MP4 视频在谷歌浏览器无法播放本质上,html 是使用 <video>标签播放视频的,大部分的浏览器我相信都是支持的。但是今天遇到一个问题,在 APP 端拍摄了两段视频,一段可以播放,一段播放失败。排除了服务器、文件存储服务器的问题,怀疑过是前端代码写错了,怀疑是网速限制,视频被截断了。没想到最后究其原因居然是因为 mp4 的视频码流格式问题,谷歌浏览器不支持。mp4 都是 mp4, 然而这只是为了操作系统去识别哪些应用可以播放。实际内容需要看视频流的格式或者说编码,但是视频流
2021-12-10 19:15:29 11734 1
原创 排查与解决`java.io.EOFException: \n not found: limit=0 content=…
排查与解决java.io.EOFException: \n not found: limit=0 content=…问题起因是项目向华为云 OBS 请求视频, 偶现题目中的异常;如果等一段时间(30s),就可以正常读取到视频。原因是 OBS SDK 底层用的 Okhttp 连接池,而 Okhttp 的 GitHub 上也有相关 issue:服务器在返回数据后就直接关闭 TCP 连接,而客户端(项目应用)却将连接放入连接池重复使用;当下次请求复用时,连接已经被关闭,就读取不到返回值,报上述异常。
2021-12-09 15:45:36 16007 3
原创 Retrofit 源码阅读记录
RetrofitRetrofit 是唯一的门面,所有的动作都是通过 Retrofit 进行的。通过 builder 的模式生成实例。platform:平台类型,以作不同兼容callFactory :用来创建方法调用模型 Call(可异步或同步,有点像 FutureTask,用来获取结果的调用),将方法调用转为 Http 访问。baseUrl:基础地址。 一般代表域名或 IP,标识域名最后必须带\,保证 path 的准确性。如果 host + path 出现两次 \,则会被优化正常模式.
2021-08-19 15:31:28 128
原创 很“抠”性能的 Java 读写锁
源码版本:OpenJDK 11读写锁之前分析过并发场景下高频使用的 Reentrantlock 源码解析 (juejin.cn),该类实现 Lock接口,以达到独占获取的语义。而这次分析ReentrantReadWriteLock 实现的是 ReadWriteLock接口。ReadWriteLock 我理解为是 Lock在特定场景下的扩展,当然我们都知道这个场景就是读多写少。在读多写少的场景下,如果依旧是独占式获取资源,很显然会出现性能瓶颈。ReadWriteLock所表达的读写锁语义是在同一.
2021-08-06 10:20:04 290
原创 记一次 MySQL 提取 Json 内部字段转储为数字
MySQL 提取 Json 内部字段转储为数字这只是一次简单数据迁移的统计,数据量不大,麻烦的是一些中间步骤处理和思量。没有 SQL 优化、索引优化的内容,大家轻喷。背景用户眼科属性表记录数大概 986w,目的是把大概 29w 记录的属性值(json 格式)的其中八个字段解析为数字,转储为统计表的记录,用于图表分析。以下结构、数据都大部分我瞎诌的,不可当真用户眼科属性表结构如下CREATE TABLE `property` ( `id` int(11) NOT NULL AUTO_I
2021-07-08 17:31:07 515 2
原创 《程序员修炼之道:从小工到专家》六千字读后总结
《程序员修炼之道:从小工到专家》六千字读后总结读完这本书,其实花的时间并不多,因为我自己有些基本的认知。这里主要是记录了一下当时的思考和总结,仅是我个人思考与经验。这本书和极客时间的《10x程序员工作法》有异曲同工之妙,搭配更下饭,消化更快速,“长胖”更轻松。那这本书大概讲了什么呢?这本书不讲深奥的技术,不谈高谈阔论的思想,也不局限于编程语言,本身只是列出一个个很小的 checklist,引发读者的思考,鼓励读者成为实践者。如果你愿意,你每次写代码前、写代码时、写代码后,把它当成工具书翻一翻;在
2021-06-27 17:49:40 539 1
原创 多线程编程之CyclicBarrier 源码分析
CyclicBarrier 源码分析之怎么卷死 CountDownLatchCyclicBarrier 是什么?CyclicBarrier 一般称为栅栏、屏障,是一种多线程同步工具。常常和 CountDownLatch一起作比较,因为都属于用于一组线程等待的工具。不同于 CountDownLatch常用于协调线程等待一组工作线程,且工作线程到达后做一次通知并继续执行,CyclicBarrier 人如其名的是一组线程相互等待全部到达指定处后,再全部继续执行。CyclicBarrier更高级的是:
2021-06-22 15:21:28 172
原创 多线程编程之 CountDownLatch
CountDownLatch 是什么?CountDownLatch 一般称为闭锁、计数器,是一种多线程同步工具,属于 AQS 体系的一员。常用于让协调线程等待一组工作线程全部“完成工作“或“满足特定条件"后继续进行下去。但其实也可以和 CyclicBarrier让一组线程全部到达指定点后才继续执行,不过不如 CyclicBarrier简单且不可重用,所以一般一组线程自等待的场景我们倾向于直接使用 CyclicBarrier。CountDownLatch 怎么用?老板有个保险箱,为了保证安全,指定
2021-06-22 15:20:57 884
原创 多线程编程之ReentrantLock源码
之前把 AQS、Unsafe(LockSupport 其实就是一层简单的封装) 搞完了,接下来就可以看看各种锁、并发工具、线程池了,毕竟他们都有依赖 AQS 或 Unsafe 的实现。Lock & ConditionJava SDK 并发包通过 Lock 和 Condition 两个接口重新实现一次管程,其中 Lock 用于解决互斥问题,Condition 用于解决同步问题。那为什么要重新实现一次呢,用关键字 synchronized 不就好了吗?很多程度上是为了有效避免死锁。原因是 Sy
2021-06-22 15:20:15 108
原创 《RabbitMQ 实战指南》单机能力思维导图
RabbitMQ 单机 消息发送定制 mandatory true:如果 exchange 根据自身类型和消息 routeKey 无法找到一个符合条件的 queue,那么会调用 basic.return 方法将消息返还给生产者。 false:出现上述情形 broker 会直接将消息扔掉。 immediate true:如果exchange在将消息 route 到 queue(s) 时发现对应的 queue 上没有消费者
2021-05-16 16:38:39 234
转载 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
本文转自消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局_朱小厮的博客-CSDN博客_kafka rabbitmq 对比消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局一、前言消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组
2021-05-16 15:37:06 185
原创 AQS Condition源码深度解析
简介在上一篇《AQS》ConditionQueue 介绍中提到了 ConditionQueue 是借助 AQS 的 SyncQueue 结构来实现条件变量及等待的功能。ConditionQueue 是 AQS 中相对特殊、复杂的队列。相比较 SyncQueue 只把资源争抢、线程通信全部在 AQS 中处理,那ConditionQueue 就是为了对标 Object#wait、notify、notifyAll 而设计的数据结构,就是为了让开发人员可以手操线程同行。队列结构ConditionQueue
2021-04-16 17:41:06 266
原创 你学“废”了的 AQS 源码
版本:JDK 11为了这篇文章,我已经废了,太绕了。我能力有限,没法保证说的清楚。前提是看官对这块了解一些,尤其是某些概念,比如 CAS、队列、线程生命周期等。另外注意:这是纯 AQS 源码解析,没有结合实际子类和使用场景,所以理解起来很困难。后期我会再对 AQS 的子类进行解析,加强理解。1.什么是 AQS?AQS 是 AbstractQueuedSynchronizer 缩写,译为抽象队列同步器。顾名思义,有抽象就有实现,为了什么而抽象很重要。抽象:定义了资源获取的通用逻辑,要求子类实现
2021-03-20 21:42:44 163
原创 关于 Unsafe,我只说这么“多”
JDK 版本: OpenJDK 11什么是 Unsafe?这是一个别有用心的名字,直接了当地告诫开发者,这是一个“不安全”的类。我们知道 Java 不同于 C,由于存在 JVM 这个中间层,一般开发者是无法通过代码直接去操作内存的,一切都是 JVM 在幕后操作的。而 Unsafe 定义了低层次、不安全的操作。有多低、有多不安全呢?是的,对应第一句话,Unsafe 允许直接访问或操作到内存上的数据。这样固然更快捷,但是牺牲的却是 JVM 对对象或变量访问操作的检查和限制,就有点类似于通过反射来操作
2021-02-25 14:09:44 288 2
原创 拆行解码 Java 集合源码之 Hashtable
特性键值都不可以为 null;重要且影响性能的参数:初始容量和负载因子。容量是哈希表中存储桶的数量,初始容量只是创建哈希表时的容量。负载因子是在自动增加哈希表容量之前允许哈希表元素与全部容量的占比。默认是 0.75。是线程同步的,具备一定的线程安全的。需要高并发的话,还是建议 ConcurrentHashMap。只有链表结构,不会树化的。构造函数初始容量设置时,至少大于0。(如果值为 0,会自动设置为 1)。默认容量 11,默认负载因子 0.75。 public Hasht
2021-02-20 16:33:22 90 1
原创 拆行解码 Java 集合源码之 LinkedHashMap
特性LinkedHashMap 继承自 HashMap,像是 put、get、扩容等操作都是沿袭自父类。只是在此基础上,重写了对相关结点的钩子方法,去构建了结点的双向链表。这样做的目的,就是为了维护可预测的结点遍历顺序。这种遍历顺序默认是结点的插入顺序(当 key 已存在的情况下,put 的更新时不会改变原有的顺序。),可以设置为访问顺序。可以以 Map 为基准构建,将 Map 中结点的原有顺序作为遍历顺序。基于访问顺序,可以方便地实现 LRU 缓存。初始容量和负载因子,同 HashMap。
2021-02-20 16:32:50 106
原创 拆行解码 Java 集合源码之 PriorityQueue
特性不允许 null。基于小顶堆的无界优先级队列,顶=队头。排序基于元素可比较(要么实现 Comparable;要么指定 Comparator)不保证迭代器以特定顺序遍历元素顺序遍历可以使用 Arrays.sort(pq.toArray())。线程不安全,同步可使用 PriorityBlockingQueue。效率入队和出队方法( offer、poll、remove、add )提供 O(log(n)) 时间;remove(Object) 和 contains(Obj
2021-02-20 16:30:28 111
原创 拆行解码 Java 集合源码之 ArrayDeque
环形队列。初始容量 16指定容量时,因为是环形队列,所以数组末尾必须有个空位,用作头尾判空或满的依据。(numElements < 1) ? 1 : (numElements == Integer.MAX_VALUE) ? Integer.MAX_VALUE : numElements + 1保存双端索引:head 和 tail。为空时:0 <= head = tail < elements.length满:length - head = tailele..
2021-02-20 16:29:52 82
原创 拆行解码 Java 集合源码之 LinkedList
特性双向链表由于是链表,所以不存在扩容上的问题。元素允许为 null。不支持随机访问。与 ArrayList 直接继承 AbstracList 不同, LinkedList 与 AbstractList 之间还有一层类 :AbstractSequentialList:标明该集合支持顺序,不支持随机。同时实现 List 和 Deque,具备列表和双写队列的作用。非线程安全。可使用 Collections.synchronizedList 包装为线程安全列表。源码解析
2021-02-20 16:27:16 83
原创 把 ThreadLocal 拆开揉碎了看看
前言1.为什么用 ThreadLocal?所谓并发,就是有限资源需要应对远超资源的访问。解决问题的方法,要么增加资源应对访问;要么增加资源的利用率。所以,相信这年头做开发的多多少少,都会那么几个“线程二三招”、“用锁五六式”。那所带来的就是多线程访问下的并发安全问题。共享变量的访问域跨越了原始的单线程,进入了千家万户的线程眼里。谁都可以用,谁都可以改,那不就打起来了吗?因此,防止并发问题的最好办法,就是不要多线程访问(这科技水平倒退二十年~)。ThreadLocal 顾名思义,将一个变量限制为“
2021-02-20 14:49:07 111
原创 拆行解码 Java 集合源码之 HashMap
文章目录特性结点数据结构链表 Node红黑树Node源码预设参数一览相关参数一览构造函数Hash 函数Put扩容 resize方法容量、阈值计算结点的重新索引Get & RemoveRemove钩子方法特性Key、Value 允许为 null。希望 key 是不可变对象, 即 hashcode 不变。不同步,线程不安全。同步使用包装类:Collections.synchronizedMap。假设 Hash 函数将元素正确分散在 bucket 中,则此实现为基本操作(get
2021-02-07 12:20:49 112
原创 拆行解码 Java 集合源码之 ArrayList
ArrayList 特性数据结构:Object[],可动态扩容(新建数组的方式)允许元素为 Null。非线程安全。可使用 Collections.synchronizedList 包装为线程安全列表。支持随机访问,通过元素索引:RandomAccess 接口标识(无任何方法,仅做标识)。Collections.binarySearch() 对于传入的接口,会判断是否实现了 RandomAccess。插入和删除元素的时间复杂度受元素位置的影响。源码public class Array
2021-02-07 12:20:18 162
原创 拆行解码 Java 集合源码之迭代器
迭代器还有一个接口 Iterator,每个集合类内部通过实现该接口,实现集合元素的遍历。将遍历序列的操作与序列底层的结构分离。该对象必须依赖于具体容器,因为每一个容器的数据结构不同;所以迭代器对象是在容器中进行实现的(内部类)。迭代的时候只能进行删除(可选操作)。for(Iterator it = Collection.iterator(); it.hasNext();){ E e=it.next(); it.remove();}ps:1.2 之前是通过 Enumeration
2021-02-07 12:19:40 126
原创 拆行解码 Java 集合源码之 Collection 的三大体系
Collection 的三大体系List元素有序、可重复;可以明确控制元素的插入位置可以根据索引访问元素。提供额外支持插入和双写遍历的 ListIterator,允许从指定位置开始遍历。提供静态工厂方法,用于创建视图List。来源于 ImmutableCollections。不可增删改。元素不能为 Null。顺序与原数组或集合一致。equals 判断大小相等,顺序遍历上元素相等。基于 List 是有序的。Queue在数据插入、删除与访问上,除了继承 Collection
2021-02-07 12:19:15 76
原创 拆行解码 Java 集合源码之总览
集合总览Collection 和 Map 是 Java 集合最顶层的接口或者概念,无论是集合包还是并发包,都基于此。核心特点:用于存放对象的容器;可变长度,自动扩容;不可存储基本类型。在 Collection 之下,又分为几类:Set:是否有序,看具体实现。元素唯一,判断依据:HashCode、EqualsList:有序集合,元素不唯一。Queue:不唯一,先进先出Stack:不唯一,先进后出List、Set 可以操作集合中任意位置的元素;List 可以精确控制插入的位置,
2021-02-07 12:18:16 99
原创 构建 openjdk11源码阅读环境
文章目录1.创建新项目2.找到对应 JDK 的源码压缩包3.解压 src.zip 到项目目录下4.如何调试时,查看自己注释的代码,或同时进行注释5.调试6.其他问题6.1 编译 OOM6.2 创建的项目使用了 版本管理工具,调试时运行失败6.3 jdk源码写过注释后debug提示source code does not match the bytecode6.4 上传到 github前言:jdk版本:openjdk 11编辑器:idea 2019.1.2电脑:Mac OS1.创建新项目用 i
2021-01-20 16:15:48 1229
原创 对结构型设计模式之间区别的一点点认识
前提是对设计模式有一定的认识。1.代理模式:通过继承的方式,控制外界对原对象的访问。代理模式要求代理对象和原对象实现相同的接口(Cglib 通过继承原对象的类实现)。 外界对其不可感知,不知道其实是访问经过了代理对象,到达实际对象。对于外界来讲,只知道代理对象;对于内部来讲,被代理对象所有行为都被拦截,不可以替换、不可以通过外部传入被代理对象。代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。主要增强的是非主干或者说非业务
2021-01-10 13:52:27 209 1
原创 RabbitMQ - 高级地发送消息
定制消息发送上文在《RabbitMQ Client 怎么用?》中,提到通过 Channel 类的 basicPublish 方法推送消息。而提供的最完整的方法如下:void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) throws IOException;其中两个比较特殊的参数:mandatory 和
2021-01-01 23:17:46 137
原创 RabbitMQ Client 怎么用?
RabbitMQ client 的使用连接 RabbitMQprivate static Channel _getChannelBySetter() throws IOException, TimeoutException { ConnectionFactory factory = _getConnectionFactoryBySetter(); Connection connection = factory.newConnection(); // channel 不建议线程共享
2020-10-10 18:36:32 2965
原创 LRU 不大行?试试 LIRS
LRU 不大行?试试 LIRSLIRS 是什么?Low Inter-reference Recency Set,它和 LRU 一样,是一种内存淘汰策略。继承了 LRU 根据时间局部性预测内存冷热数据的特性,引进了 IRR(Inter-Reference Recency) 和 R (Recency),来增加对冷热数据的预测准确性,从而减少错误的数据淘汰,提高缓存命中率。既然说到 LIRS 是继承 LRU,那就不得不聊聊 LRU 有哪些优缺点,以及顺便聊聊大佬们还有哪些改进吧。先来说说 LRU内存淘
2020-10-09 17:35:31 906
原创 精通 RabbitMQ,从认识开始
RabbitMQ 介绍简介(参考《RabbitMQ 实战指南》)RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。RabbitMQ 发展到今天,被越来越多的人认可,这和它在易用性、扩展性、可靠性和高可用性等方面的卓著表现是分不开的。RabbitMQ 的具体特点可以概括为以下几点:可靠性: RabbitMQ使用一些机制来保证消息的可靠性
2020-10-09 17:28:54 126
原创 消息队列没听过?给你科普下
消息队列什么是消息队列消息队列,或者称为大家常说的消息中间件,顾名思义,首先它是一种队列。平时像 Java 中常见的队列,作为一种存储数据的容器,具备先进先出的特性。而类比一下,我们也可以理解为消息队列也就是一种存储消息的容器;不过相比较于一种语言中所定义的容器,它本身支持更底层的协议或者标准,提供应用与应用之间消息可靠传递的能力。消息队列作为分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。为什么要使用消息队列消息队列凭借其独特的特性,在不同的应用场
2020-10-09 17:27:07 342 1
转载 解决git rebase操作后推送远端分支不成功的问题<转>
<转载>原文:https://blog.csdn.net/ManyPeng/article/details/81095744前段时间在工作中同事在rebase时遇到一个问题来问我,今天突然想起来觉得有必要记录一下。在我们日常工作中,经常使用git座位代码管理工具,而且一个项目通常由多人开发,我当时所在组的git管理策略是master分支作为主干的无bug分支(测试验证通过),每个开发在自己的个人分支上进行开发,当开发完毕时rebase master分支,然后进行提测,测试通过后,再.
2020-09-14 12:12:31 481
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人