随笔分类 - Java
摘要:入坑这么多年,作为一名java攻城狮,资深代码搬运工,我有话说: 1、提高技术壁垒,扩大公开象限 作为开发同学,从入行第一天开始就应该有持续不断地学习新技术的觉悟。积累的多了,说话的水平都不一样了,思路也会更开阔。如果有一个东西,别人都没听说过,就你知道,那么你说出来,就跟别人不一样。看了一篇文章以
阅读全文
摘要:1. 概述 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构
阅读全文
摘要:通常,功能上线之前,压测是必不可少的,可以从以下几个点进行优化 : 1、Redis连接数、大key(hash key)。但凡用到线程池的地方,都是有优化空间的,合理设置线程池参数可以提高吞吐量。这些参数的设置是经过很多次的压测调整再压测这样试出来的; 2、Dubbo线程数、超时时间等; 3、内存缓存
阅读全文
摘要:1. Easy Rules 概述 Easy Rules是一个Java规则引擎,灵感来自一篇名为《Should I use a Rules Engine?》的文章 规则引擎就是提供一种可选的计算模型。与通常的命令式模型(由带有条件和循环的命令依次组成)不同,规则引擎基于生产规则系统。这是一组生产规则,
阅读全文
摘要:1. 概念 Reactive 非常适合低延迟、高吞吐量的工作负载。 Reactive Processing 是一种范式(规范),它使开发人员能够构建非阻塞的、异步的应用程序,这些应用程序能够处理背压(流控制) Reactive Streams 为无阻塞背压的异步流处理提供标准。 Reactor 是基
阅读全文
摘要:1. BitMap Bit-map的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。(PS:划重点 节省存储空间) 假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中,并假设32位操作系统
阅读全文
摘要:Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架。 Cache(缓存),基于Google Guava,Caffeine提供一个内存缓存,大大改善了设计Guava's cache 和 ConcurrentLinkedHashMap 的体验。 1 LoadingCache<
阅读全文
摘要:1. Redisson Redisson是Redis官方推荐的Java版的Redis客户端。它提供的功能非常多,也非常强大,此处我们只用它的分布式锁功能。 https://github.com/redisson/redisson 1.1. 基本用法 1 <dependency> 2 <groupId
阅读全文
摘要:能异步绝不同步,能并行绝不串行 1. Future 一个Future代表一个异步计算的结果。Future提供检查计算是否完成、等待计算完成并获取计算结果的方法。只有当计算完成以后,才可以使用get方法检索结果,否则将会阻塞直到计算完成。通过调研cancel方法可以取消执行。另外,还提供了检查任务是正
阅读全文
摘要:最近做了一个搜索接口的优化,反复压测了四次,终于达到要求了,记录一下,晚上加个鸡腿🍗 业务逻辑 从OpenSearch中检索出数据,然后各种填充组装数据,最后返回 逻辑看似很简单,当初我也是这样认为的,于是预估5天完成,最后前前后后开发、联调、改bug直到上线差不多花了10天(当然这10天并不是只
阅读全文
摘要:接上一篇 《JDK1.8中的线程池》 1. 任务执行失败时的处理逻辑 1.1. Worker Worker相当于线程池中的线程 可以看到,Worker有几个重要的属性: thread : 这是Worker运行的线程,可以理解为一个Worker就是一个线程 firstTask : 初始任务,可能为为n
阅读全文
摘要:1. 带着问题去阅读 为什么说ConcurrentHashMap是线程安全的?或者说 ConcurrentHashMap是如何防止并发的? 2. 字段和常量 首先,来看一下ConcurrentHashMap中的一些字段和常量,这些在接下来的操作中会用得到 2.1. 常量 从中,我们可以获得以下信息:
阅读全文
摘要:1. 概念理解 1.1. 并行(Parallel)与并发(Concurrent) 并行:指多个垃圾收集线程并行工作,但此时用户线程仍然处于等待状态 并发:指用户线程与垃圾收集线程同时执行 1.2. Minor GC 与 Major GC Minor GC:指发生在新生代的垃圾收集动作,因为Java对
阅读全文
摘要:1. Java虚拟机运行时数据区 在JDK1.8之前,JVM运行时数据区分为堆、虚拟机栈、本地方法栈、方法区、程序计数器。如下图所示: 虚拟机栈:线程私有,随线程创建而创建。栈里面是一个一个“栈帧”,每个栈帧对应一次方法调用。栈帧中存放了局部变量表(基本数据类型变量和对象引用)、操作数栈、方法出口等
阅读全文
摘要:本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 1. 分布式理论 1.1. CAP定律 CAP指的是:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。 CAP定律说的是,在一个分布式系统中,最多只能满足C、A、P
阅读全文
摘要:1. wait / notify 要想执行 wait() / notify() / notifyAll() 这些方法,必须首先获得对象的监视器 换言之,这些方法必须在 synchronized 中执行 2. Condition 3. wait() Causes the current thread
阅读全文
摘要:1. ThreadLocal是什么 ThreadLocal提供线程局部变量。这些变量与普通的变量不同之处在于,每个访问这种变量的线程(通过它的get或set方法)都有自己的、独立初始化的变量副本。 ThreadLocal实例通常是希望将状态关联到一个线程的类的私有静态字段(比如,user ID 或者
阅读全文
摘要:1. 前言 Java中好多地方用到AbstractQueuedSynchronizer(PS:简称AQS),比如ReentrantLock、线程池,这部分在面试的时候也经常被问到,今天以ReentrantLock为例,通过源码来加深对AQS的理解 2. lock 通常,我们的用法是这样的: 那么lo
阅读全文
摘要:jmap JDK自带了一些工具可以帮助我们查看JVM运行的堆内存情况,常用的是jmap命令 jmap -heap <pid> 打印堆的使用情况 那么,从这个输出中我们也可以大致看出堆的结构,分为Young Generation (年轻代) 和 Old Generation (老年代) Young G
阅读全文