- 博客(23)
- 收藏
- 关注
原创 WebSocket-学习调研
WebSocket是一种基于单个TCP的全双工通信协议,它为客户端和服务端之间提供了一种双向的,高效的通信手段。WebSocket在第一次TCP握手后,会建立一个长连接,客户端和服务端可以通过这个长连接实现实时的双向通信。WebSocket协议最初由开发,并于2011年成为标准。
2025-11-13 16:31:03
979
原创 grpc-高性能rpc框架-学习文档
grpc(gRPC Remote Procedure Call)是一款高性能,跨语言,轻巧的rpc远程调用框架。它是由Google公司开发的开源框架。它基于 HTTP/2 协议,使用 Protocol Buffers 作为接口定义语言 (IDL) 和序列化协议。gRPC 可以高效地连接数据中心内和跨数据中心分布的服务,并且支持多种编程语言。grpc框架主要用于微服务等领域实现各个服务之间的调用,它可以让你调用远程服务像调用本地服务一样简单。
2025-11-13 09:20:52
1208
原创 JAVA中i++的线程安全问题以及解决办法
在java中,i++是一个非常常见的运算符,我们在日常编码中频繁的使用,但是就是这么一个简单的运算符,在多线程环境下,很可能给你埋一个大坑,本文章,我们来探究下i++的线程安全问题以及解决思路。
2025-08-05 15:59:26
539
原创 多线程传递上下文
在排查日志的时候,由于开启的异步线程,导致日志链路断裂,导致日志混乱,存在无从得知是哪个链路开启的异步线程,异步线程与主线程间的关系丢失,难以排查,这类问题主要是线程切换导致,所在上下文发生改变,导致无法获取到前线程的上下文信息。(2)一般的使用流程就是父线程中往TTL存入所需要传递的值,在子线程调用就可以了,类似于日志框架中的MDC,但是为了应对线程池的池化后的上下文异常问题,我们需要对线程池做一个代理的操作。在代码中,我设置了父线程的值,启动了异步线程,在异步线程中打印父线程设置的值。
2025-07-15 17:43:35
524
原创 局部内部类和匿名内部类对变量的访问规则
在Java中,局部内部类(包括匿名内部类)对变量的访问规则存在明确差异,包括对局部变量,和类变量。尤其是对局部变量访问的一种限制,在很多时候我们都会误以为它能够访问(特别在jdk8之后,添加了语法糖,我们很容易忽略一些细节),但是代码老实报错。以下我将详细介绍在Java中,局部内部类和匿名内部类的变量访问规则。
2025-05-09 21:07:35
734
1
原创 JAVA Reactor中Sinks.Many类的简单理解
实现细节隐藏: Sinks.Many 的实际实现(如 MulticastReplayProcessor 或其他内部类)被封装在 Sinks 类的内部。接口职责分离: Sinks 类作为工厂,统一管理所有类型的 Sink(如 Sinks.One、Sinks.Many),而 Sinks.Many 作为内部接口,明确表示它是一个多播数据源,与单播(Sinks.One)等场景隔离。这个类提供了一种简单而强大的方式来处理多个事件流,并且可以通过异步或者同步的方式处理这些事件。
2025-05-08 10:35:52
2245
原创 JAVA Reactor学习--流的异步处理
区别是publishOn会让之后的操作在Scheduler提供的线程中执行,subscribeOn会让之前的操作在Scheduler提供的线程中执行。在Reactor中,提供了多种Sxheduler(类似于线程池,不过是有Reactor管理的)的实现,在Schedulers中提供了多种工厂方法,去获取。这种异步的本质,是将那些阻塞的方法,统一交给Reactor放到其他线程里面管理,以至于,不阻塞主线程的执行,在阿里的代码规范插件中,如果你显示的订阅流,但是没有使用调度器,会出现一下提示。
2025-05-07 20:43:53
412
原创 JAVA中OkHttpClient与Flux的简单使用
在上述代码中,在处理流式数据的时候,我们需要使用FLuxSink中的方法,上述的FluxSink变量是sink。就我而言,我一般使用Flux.create()方法去将OkHttp的响应数据封装成Flux流数据,如果没有订阅,Flux 的创建和操作符定义只是声明逻辑,不会执行任何实际的数据加载或处理。:Project Reactor中的响应式流类型,用于处理异步数据序列(0-N个元素)。在响应式编程中,Flux 定义了一个数据流的处理流程,但。,只有在订阅者明确请求数据时,才会触发数据流的执行。
2025-05-06 16:03:58
2123
原创 设计模式-单例设计模式
以上的知识大多是为了理解和面试而使用和学习,有些人甚至认为单例是一种反模式(anti-pattern),压根就不推荐使用。大部分情况下,我们在项目中使用单例,都是用它来表示一些全局唯一类,比如配置信息类、连接池类、ID 生成器类。单例模式书写简洁、使用方便,在代码中,我们不需要创建对象。但是,这种使用方法有点类似硬编码(hard code),会带来诸多问题,所以我们一般会使用。
2025-05-03 22:56:14
653
原创 力扣128:最长连续序列
使用哈希表进行数据的存储,这样存储的时间复杂度是O(1),如何我们在循环遍历一遍即可,时间复杂度刚好是O(n),要注意的是,这里需要去重(数字连续不包含相同数字),所以我们使用set这种数据结构。一开始想到先排序如何在遍历一遍,不过时间复杂度达到了O(nlogn),后面想到了用hsah,不过后面去看那些时间很短的人,都是用的排序,想想就气人。元素1是开头,因为没有0,且以1开头的序列长度为4,因为依次累加,2,3,4都存在。元素200是开头,因为没有199,且以200开头的序列长度为1。
2025-04-21 20:16:26
203
原创 ThreadLocal 的理解
ThreadLocal叫做线程变量,其中维护的变量,独属于ThreadLocal对应的线程,其他线程无法访问到ThreadLocal中的变量,所以ThreadLocal是线程安全的。ThreadLocal线程安全的原理在于,ThreadLocal会为每一个线程提供一个副本,每个线程访问的都是自己的ThreadLocal,相互隔离。一般来说ThreadLocal会被private static修饰,但如果需要在多个方法间使用,也可以放开private使用public,实现在多个方法和类中使用。
2025-04-17 11:13:21
1505
原创 对JAVA多线程的认识
多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能: (1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;(4)可以随时停止任务;(5)可以分别设置各个任务的优先级以优化性能二、多线程的缺点:(1) 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
2023-06-17 17:24:50
197
原创 IO流的基础
3、在处理 除 英文和英文符号外的其他语言,使用字节流会出现乱码的情况,因为字节流是一个字节一个字节的传递数据,像中文是由多个字节组成的,传递时会有失传的情况,而字符流的就是为了避免这种情况而出现的。//创建字节输入流的对象。int read(byte[] b,int off,int len)//从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。int read(byte[] b)//从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中,并返回读入的长度。
2023-06-05 21:58:18
163
原创 File文件类
public File(String pathname)//根据文件路径创建文件的对象public File(String parent ,String child)//根据文件的父级路径和子机路径创建文件的对象public File(File parent,String child)//根据父级路径对应的文件,和子级路径创建文件对象。
2023-06-04 21:12:55
132
原创 JAVA中的异常
1、定义异常类2、写继承关系//一般继承RuntimeException3、空参构造4、带参构造//为了让控制台的报错信息更详细示例public class AgeOutofBoundsException extends RuntimeException{//写继承关系}//带参构造}//空参构造。
2023-05-21 20:40:45
132
原创 三大遍历集合的方式
所需的方法 default void forEach(Consuner<?1、报错(NoSuchElementException)如果需要再次遍历,则需再次创建Iterator对象。修改增强for中的变量,不会改变集合中的原本的数据。hasNext方法必须与Naxt方法配套使用。for(元素类型 变量名 : 数组或集合){4、迭代器遍历时,不能用集合的方法进行增删。2、迭代器遍历完毕,指针不会复原。3、循环中只能用一次next方法。
2023-05-14 21:10:02
99
原创 抽象类与抽象方法
1、将共性的行为(方法)抽取到父类中。由于每个子类中执行的内容不一样,public abstract 放回值类型 方法名(参数列表);所以,在父类中不能确定具体的方体。该方法就可以被定义为抽象方法。4、抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。1、如果一个类中存在抽象方法,那么该类就必须声明为抽象类。可以判断重写的方法是否正确,也能提高代码的可读性。要么必须重写所有的抽象方法。2、抽象方法的定义格式。2、抽象类的定义格式。3、抽象类不能实例化。即抽象类不能创建对象。
2023-04-23 21:25:37
310
原创 JAVA中继承的定义及使用
1、java语言一般不允许大量重复的代码出现,这段代码不仅从代码上重复,而且从概念上讲学生一定是人,只是学生类描述的范围小,具备更多的属性和方法,这个时候想要消除结构定义上的重复,就要用到继承。继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。需要注意:Java是单继承的,一个类只能继承一个直接父类,跟现实世界很像,但是Java中的子类是更加强大的。注意(调用子类的构造方法时也会通过super调用父类的构造方法)。
2023-04-16 21:08:02
519
原创 JavaSE 中的 this 关键字
2、this是一个引用类型的变量,this变量中保存了指向自身本类中的内存地址、this存储在JVM堆内存中Java对象的内部。4、this关键字只能存在在构造方法中和成员方法中、在这些方法中会默认传递一个this的引用类型的变量。5、注意 在被static 修饰的方法中是没有 this 关键字的。this关键字的语法 (1)this. (2) this()3、每创建一个对象就有一个与之对应的this关键字。第一种语法通常是用来调用本类中的变量和成员方法的。第二中语法通常是用来调用本类中的构造方法的。
2023-04-09 20:26:54
115
原创 JAVA 中集合ArrayList的基本使用
ArrayList<引用数据类型> 参数 = new ArrayList<>();集合中同数组一样 也有 索引,可以通过索引找到元素。在Java中,集合位于java.util包下。如果需要存储基本数据类新,就需要将其包装成类。数组可以存储基本数据类型和引用数据类新。利用集合可以实现对数据的增删改查。二、集合与数组的存储数据类型差异。四、ArrayList中的方法。而集合只能存储引用数据类新。集合的长度是可以改变的。
2023-04-02 19:08:29
357
原创 【无标题】 Java中的数组
1、(一维数组) 数据类型[] + 名称;2、(二维数组)数据类型[] + 名;数据类型 + 名称[][] = { {变量1,变量2,,变量n },{变量1,变量2,,变量n } };1、(一维数组) 数据类型 + 名称 [];2、(二维数组)数据类型 + 名 [];数据类型 + 名称 [] = {变量1,变量2,,变量n };数据类型 + 名称[][] = new 数据类型[个数][个数];数据类型 + 名称[] = new 数据类型[个数];{变量1,变量2,,变量n }
2023-03-19 21:02:50
168
原创 JAVA学习笔记1
第三步 win+R 输入cmd打开运行窗,输入java -version 查看jdk版本。找到系统变量中的path变量,编辑,并新建,将java.bin路径粘贴并确定即可。首先学习JAVA语言,需要下载Java的jdk并为其配置环境变量。右键此电脑,点击属性,找到高级系统设置,点击环境变量。对于我们初学者,一般选择下载 java8。在新建文本文档路径上输入cmd,进入命令行。新建一个文本文档,将后缀改成.java。下完后,选择jdk的安装路径即可。第一步,进入官网下载jdk。第二步,配置环境变量。
2023-03-12 00:07:10
307
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅