自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 idea启动java进程 -classpath 如何设置

在启动java进程执行对应的程序的时候,需要先去指定jvm加载依赖的路径。命令行执行的时候可以通过 java -classpath来执行。在idea执行运行的时候是从如何设置的呢?当项目被mavn编译完成后,会降所有的依赖放在External Libraries下面,所以执行idea启动main函数的时候会默认将 External Libraries下面的jar作为classpath。System.getProperty(“java.class.path”)可以查询classpath下面的内容。

2023-03-14 16:43:25 2413

原创 使用自定义maven骨架快速创建项目模板

前言在微服务的场景下,通常我们需要定义一个通用的项目内部模块的模板,比如api模块,common模块或者core模块。如果模块较多的话创建起来很费时间,而且手动一个一个创建容易出错。maven工具提供了自定义maven骨架模板,可以利用自定义的骨架一键复制标准的模板框架。省时省力。下面介绍一下如何定义自己的maven骨架以及如何使用骨架复制模板。自定义骨架首先创建一个标准模板,如下图所示:并根据需要创建字模块修改pom.xml文件,增加maven骨架插件<build>

2021-10-29 11:47:24 516 1

原创 CopyOnWriteArrayList设计原理

前言CopyOnWriteArrayList是jdk包中提供的一个集合容器,基础能力和ArrayList相同。但是ArrayList是线程不安全的,在并发场景无法使用。CopyOnWriteArrayList是一个线程安全的集合类,那么它是如何做到线程安全的呢?我们一起探究一下CopyOnWriteArrayList的基础实现。设计原理CopyOnWriteArrayList底层通过读写分离来保证线程安全,其底层数组和ArrayList一样放在数组里面,我们称这个为原数组,读的请求都会去原数组查找数据

2021-08-21 22:53:37 201

原创 RocketMq之push消费模式详解

前言本文中消费流程是基于集群模式下push并发消费的场景进行剖析的。使用姿势下面是一个简单的消费者代码: // 创建消费者实例,并指定消费者组 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4"); // 设置NameServer地址的一种方式,另一种方式是在环境变量中设置 consumer.setNa

2021-08-18 10:09:27 903

原创 RocketMQ的Rebalance详解

负载均衡RocketMQ的消费负载是通过queue来对消息进行分片,然后consumer消费自己对应的queue来实现。我们以如下场景为例:topicA有两个队列:queue1和queue2。消费组groupA有一台机器:consumer1queue分配如下图所示,由于只有一台消费者机器,所以分布在queue1和queue2的消息都被consumer1消费掉。如果这个时候开发人员收到消息积压告警,说明一个consumer已经无法及时处理所有消息了,对于这种情况通常会选择对消费集群进行扩容。于

2021-08-13 23:39:05 2348

原创 leetcode:DFS & BFS求解二叉树最小深度

题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。深度优先算法 DFS // 叶子节点是指没有子节点的节点。 这句话很重要 public int minDepth_dfs(TreeNode root) { if (root == null) { return 0; } if (root.left == null &&

2021-07-26 16:07:20 71

原创 leetcode:相同的树

题目给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。题解解体策略:递归 public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if (p == null || q == null)

2021-07-14 23:04:19 158

原创 leetcode:买卖股票的最佳时机 II

题目给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: prices = [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 =

2021-07-01 23:09:00 77

原创 leetcode:买卖股票的最佳时机

题目给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7

2021-07-01 22:53:25 79

原创 leetcode: 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。题目在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]题解public List<List<Integer>> generate(int numRows) { List<List<Integer>> result = new ArrayList&

2021-06-29 23:40:51 82

原创 leetcode:将有序数组转换为二叉搜索树

题目给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3]输出:[3,1]解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。题解

2021-06-28 23:53:45 256 1

原创 leetcode:合并有序数组

题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:nums1 = [1], m

2021-06-28 22:57:28 119

原创 leetcode:最大子序和

题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1javapublic static int maxSubArray(int[] nums) { // 设f(i)为以i为结束点数组的连续数组最大和,那么f(i+1) = Math

2021-06-25 00:04:26 48

原创 leetcode:搜索插入位置

题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1题解 // 用二分查找 public static int searchInsert(int[] nums, int target) { int left = 0; int right =

2021-06-23 23:52:40 63

原创 leetcode:移除元素

题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度

2021-06-22 22:31:20 70

原创 leetcode:删除有序数组中的重复项

题目Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same.Since it is impossible to change the length of the ar

2021-06-22 22:02:40 152

原创 leetcode:两数之和

题目Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.You may assume that each input would have exactly one solution, and you may not use the same element twice.You can return the an

2021-06-21 22:14:08 157

原创 guava Stopwatch

guava提供了Stopwatch用于计算程序执行中的时间消耗。那么为什么需要这个类了?我们首先看看通常我们是如何计算时间消耗的。 long start = System.nanoTime(); Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); System.out.println("耗时:" + (System.nanoTime() - start));如果使用Stopwatch应该如

2021-05-13 12:50:40 476

原创 Uninterruptibles.sleepUninterruptibly

今天在看guava RateLimit源码的时候发现在操作线程sleep的时候写法和之前不一样,于是进去一探究竟。 @Override void sleepMicrosUninterruptibly(long micros) { if (micros > 0) { Uninterruptibles.sleepUninterruptibly(micros, MICROSECONDS); } }

2021-05-12 09:58:11 1511

原创 springboot configuration类注入对象null问题排查

问题描述今日在开发过程中遇到一个spring configuration类注入失败的问题,具体代码如下:@Configuration@Import({TestBean1.class})public class HelloConfiguration { @Resource private ApplicationContext applicationContext; @Bean public TestBean2 testBean2() { TestB

2021-03-26 11:32:53 2843 1

原创 RandomAccess接口

RandomAccess

2021-03-10 17:04:24 134

原创 DDD领域驱动系列合集

阿里技术专家详解 DDD 系列- Domain Primitive阿里技术专家详解DDD系列 第二弹 - 应用架构

2021-01-21 19:20:42 361 2

原创 java.lang.OutOfMemoryError如何快速排查

前言作为一个java程序员,肯定遇到过内存泄漏的问题,那么如何快速定位到内存泄漏的原因呢?下面通过一个小的demo模拟一次内存泄漏的问题,并演示如何定位。OOM现场public class PigMachine { private List<Food> foodCache = new ArrayList<>(); public void eat() { foodCache.add(new Food()); } public

2020-11-25 15:33:29 1090

原创 学习java steam

前言开发中喜欢使用stream的模式去处理数据流,因为其结合lambda让代码更加简洁,Stream的数据处理函数名也让代码的逻辑一目了然。抽象模型介绍Streamstream接口是数据流转各节点的抽象,下面是stream的部分方法public interface Stream&lt;T&gt; extends BaseStream&lt;T, Stream&lt;T&gt;&gt; {...

2020-10-19 16:46:35 327 1

原创 参数传递解析

在使用java撸代码的时候大家是否想过这样一个问题,java代码执行过程中调用其它方法的时候参数传递是如何实现的呢?我们知道java在执行一个方法内的代码时会将方法内的数据加载到线程的工作内存。如果是基础类型数据则直接存放其value,如果是对象的引用,则存放的是对象的地址。这里需要了解对象的创建过程。如下图所示,我们创建一个Person对象a虽然只有一行代码,但是却分了三个步骤,创建Per...

2020-10-19 16:45:53 169

原创 记一次fullgc问题排查

背景线上一个数据同步集群偶现延迟,该应用对于数据的实时性要求较高,所以加上了针对延迟监控的业务告警。为了尽快解决延迟的问题,开始通过现有的监控分析出造成问题的原因蛛丝马迹通过排查发现同步的机器在一天内出现了多次fullgc。通过对比发现fullgc的时间和告警的时间相吻合,这应该就是导致数据同步延迟的罪魁祸首。那么问题又来了,是什么原因导致的fullgc呢?继续向下挖掘信息。这是发生fullgc时间的jvm内存描述信息,精确到5.30的时间点上,可以看到fullgc前老年代已使用的空间大概1.

2020-10-19 16:43:22 879 1

原创 hystrix 源码学习

demo 演示 @HystrixCommand( groupKey = "thread-control1", fallbackMethod = "failback", commandProperties = { @HystrixProperty(name = "execution...

2019-09-12 13:39:02 165

原创 java 常用文件读写代码块

文件读取获取classloader加载的文件// 从类加载器中获取文件,jar包类的文件也会被加载到类加载器InputStream inputStream = this.getClass().getResourceAsStream("/source.txt");// BufferedInputStream 通过装饰器的方式操作InputStreamBufferedInputStream...

2019-09-08 22:24:14 244

原创 inputStream源码解读

源码分析inputstream是很多io流操作的父类,其主要提供以下两个方法/** * 读取一定长度的数据到数组 */public int read(byte b[], int off, int len) throws IOException ;/** * 读取一个字节数组,内部实现是调用上一个方法 */public int read(byte b[]) throws IOExc...

2019-09-08 22:22:59 206

原创 java.util.stream.Stream#collect学习

首先看一下下面这段代码通常我们需要将一个list按照一定的规则聚合成一个map的时候,我们会这么写 Map<Long,Person> map = new HashMap<>(); for(Person person:testList) { map.put(person.id,person); }但...

2019-09-01 16:06:17 513

原创 线程池的状态

线程池的几种状态 private static final int COUNT_BITS = Integer.SIZE - 3; private static final int RUNNING = -1 << COUNT_BITS; private static final int SHUTDOWN = 0 << COUNT_BITS;...

2019-06-11 17:00:35 284 1

原创 Callable和Feature原理分析

Callable和Future原理分析Runnable & Callablejava提供两种线程实现方式Runnable和Callable。Runnable线程提交后没有返回值,主线程无法感知线程的执行结果。Callable提供返回值,通过Future的回调模式实现对线程计算结果的监听。那么Future是如何做到这一点的呢,下面通过源码分析一探究竟。举个例子 public ...

2019-05-10 00:19:07 767

原创 基于Hystrix实现限流

前言在微服务治理中,我们常常会遇到依赖接口超时或者调用失败的场景,如果没有对这些异常的场景做补偿会影响用户体验,甚至会导致应用瘫痪,影响其他业务。那如何解决呢?目前业界常用的方案就是熔断和降级两种方式。Hystrix是提供熔断降级的组件,帮助我们解决业务上的困难。下面简单介绍一些Hystrix的一些使用姿势。hystrix的两种降级方式信号量线程池下面是信号量降级的使用:具体参数的...

2019-04-17 22:31:53 5118 2

原创 maven实战-创建maven项目

创建项目工程项目名:hellogroupId:com.sxgartifactId:helloversion:1.0-SNAPSHOT使用quickstart骨架创建,mvn archetype:generate 可以自动创建指定骨架的maven结构mvn archetype:generate -DgroupId=com.sxg -DartifactId=hello -Darchetyp...

2018-11-18 14:27:21 362 1

原创 java.net.SocketException: No buffer space available (maximum connections reached?): connect 问题分析

异常日志 Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) at java.net.

2018-02-05 13:44:43 16388 5

原创 关于工厂模式和建造者模式的理解

通常情况下java里面创建一个对象都是直接使用new关键字,但是随着对java理解的深入逐渐会接触到设计模式,设计模式中关于对象创建的模式主要有两种:工厂模式和建造者模式,在这篇博文中来探讨一下这三种创建对象方式的理解,不当之处,望大家指正。 一、使用new关键字直接创建 假设我们有一个car类public class Car{ private String name; publ

2017-12-26 23:42:31 439

空空如也

空空如也

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

TA关注的人

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