Java中的协程(虚拟线程)探究

Java中的协程(虚拟线程)探究在Java最新的LTS版本 21中,终于实装了协程这一特性 当然,在这些诸如python、golang等轻量级语言中被称为协程的东西,在Java中有个全新的代号——虚拟线程,为了将协程与线程做区分,在Java21中,原Thread被称之为平台线程 下文中,将统一使用线程/协程的方式称呼 我们都知道,Java中引入了线程的概念,区别于系统中的进程 作为并发执行的最小单元,在一定的条件下,使用多个线程同时运作可以有效提高程序的运转效率 而线程这一能力源于系统本身而并非JVM 之所以说是在一定条件下,是因为受限于机器配置情况(CPU的运作机制、核心数),线程的同时运作并不能线性的提升运行性能,单个cpu并不能同时处理多线程任务,实际的运作方式是基于时间片分片,各个线程抢占式执行代码,这样能减少一些无效的io等待(例如网络io、磁盘io实际是会阻塞等待io结果),同时在多核心场景下也能有效利用cpu
Java中的协程(虚拟线程)探究2024-10-28鱼鱼

ELK实战(Ⅰ) 基于ELK整合分布式业务日志

ELK实战(Ⅰ) 基于ELK整合分布式业务日志大多情况下,我们可能都习惯了使用linux指令查看日志,很多时候一句简简单单的tail、grep能定位绝大多数问题 但是面临复杂的目录结构和分布式系统产生的“分布式日志文件”,如果还要我们一个一个去查日志,就会耗费很多没必要的时间 可以利用ELK这套组件快速搭建一个日志系统 注意此文仅针对可能很多情况下格式不确定的业务日志,对于某些组件日志我们有更好的可视化实践方式,可以参考此系列的其他文章 对于一个日志系统,我们要确认我们的诉求,在不同的场景下采用不同的收集方式: 是否是分布式系统需要合并多个节点的日志 如果需要,则需要用分布式组件收集并合并日志,这也是一个日志系统最基本的要求;
ELK实战(Ⅰ) 基于ELK整合分布式业务日志2020-03-14鱼鱼

扫盲——加密那些事

扫盲——加密那些事扫盲加密解密算法 日常开发中我们经常接触MD5算法,以此进行简单的文件完整性校验或者是后台密码验证,MD5是最常见也是最简单快捷的散列算法,常用于参数或文件完整性校验,譬如网络请求发起方与接收方分别对参数做MD5编码,一旦不一致便判断请求被篡改从而拒绝该请求,从而保证信息安全,编码后的字符串是编码前文本的一个简要梗概,因此它也被称作是信息摘要算法 这个算法的特点就是不可逆,只用于信息准确性和防篡改的校验,当然,MD5作为老牌的散列算法,很多经典的编码已经可以被反向解码出来(依靠正向的暴力穷举)以及被碰撞模仿(王小云院士团队的"破解"能够根据MD5编码后串码模拟原始消息,即使它可能与原信息不同),类似的还有SHA1,因此衍生了SHA224、SHA256、SHA512等更多安全的散列算法
扫盲——加密那些事2021-05-14鱼鱼

JVM与GC

JVM与GCJMM,长下面这个样子: 其中,堆和栈区自然不做介绍了,主要介绍: 程序计数器:线程私有的,记录正在执行的字节码地址,换言之,它告诉我们某线程执行到了那里,分支、循环等也会依赖这个来执行,这一区域不会发生OOM问题 栈:就是正常所指的栈,每个方法被执行的时候都会同时创建一个栈帧(Stack Frame )用于存储局部变量表、操作栈、动态链接、方法出口等信息 每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程,这一区域会发生StackOverflow问题 堆:就是正常所指的堆,这里是GC的主要区域 方法区:线程私有的,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,运行时常量池也包含在里面
JVM与GC2019-03-28鱼鱼

Netty

NettyNIO相比IO有诸多利处,但平常开发中若是直接使用原生NIO进行业务开发是很不可取的,否则将面临臃肿而晦涩难懂的代码 所以日常开发中我们会时常使用封装了NIO操作代码的Netty来实现NIO操作 Netty是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端
Netty2019-05-11鱼鱼

排坑指南-异步操作HttpServletRequest丢失Cookie

排坑指南-异步操作HttpServletRequest丢失Cookie遇到了一个很奇怪的bug:请求鉴权失败,因为通过Request对象获取到的Cookie中没有数据 经过debug调用request.getCookies()方法返回了null值,但是header属性的cookie却能拿到用户的有效cookie(request.getHeader("cookie")),其中缘由,且慢慢道来 我们可以在web项目中通过Request对象很方便的获取Cookie对象: 但其内部实现其实有一层缓存逻辑,从名为"cookie"的请求头中读取并处理数据转为Cookie对象并不是个省时事,在org.apache.catalina.connector.Request类中可以看到如下代码实现:
排坑指南-异步操作HttpServletRequest丢失Cookie2020-11-11鱼鱼

并发之AQS全解析

并发之AQS全解析我们知道juc(java.util.concurrent)包下有很多实用的类,提供了很多并发工具,例如线程池、原子类、并发工具、信号量工具、锁等,可以说基本实现都为悲观锁,底层原理基本都使用了AQS(AbstractQueuedSynchronizer),AQS不是一种概念,是并发中实打实的工具类 本篇文章针对AQS做解析 AQS是多线程访问共享资源的同步器框架 AQS的资源可以是独占的也可以是共享的 我们先来简单看一下它的使用方式和ApI(因为是抽象类,是不能直接使用的),下图是AQS的整体脉络 AQS核心就是一个状态值state,同时维护了一个线程的阻塞队列,队列的节点为有两种状态:SHARED(共享)和EXCLUSIVE(独占),节点状态有五种:
并发之AQS全解析2021-03-12鱼鱼

mysql orderby排序

mysql orderby排序where 字段和orderby字段组成一个联合索引,这个样一个普通业务的order只需要通过这个索引就能确定排序顺序,不需要额外的临时表来计算字段的排序 可以通过配置max_length_for_sort_data改变mysql判断采取方式 全字段排序 将命中的行的所有要查询的结果集都放到排序的临时表内,排序后将数据结果集返回 rowid 排序 将命中的行的排序字段和主键id放到临时表内排序,再根据排序后的主键id进行一次回表查询 虽然有联合索引,但是当where的条件不止一个时候,order by就会失效,可以采取多次查询结果,然后在服务中排序的方式来解决问题
mysql orderby排序2020-05-17yangwcn

tips

tips一些小tip: 向上转型,失去特征 定义相同对象,重写hash和(不是或)equal Vue.nextTick() 回调函数:在Vue(重新)渲染页面之后调用 vue绑定样式,我们会发现background-color 不能直接绑定 需写为backgroundColor 因为js中不允许出现‘-’ 存库之前,mysql会把换行符什么的过滤掉,使得出入不一致(应用场景:textarea存)解决:this.value.replace(/\n|\r\n/g,"
") linux下的mysql的表名是区分大小写的! 实现线程接口 Runnable 注解注入失败 注解注入失败 Linux下缺少部分字体,使用drawString会出问题(二维码模块),解决手段:从windows引入字体,因为不是什么主流问题所以就简单写一下,如果再碰到相关问题在详细的讲述一下
tips2019-05-08鱼鱼

常见树形结构

常见树形结构树形结构 相关术语 结点(Node):表示树中的数据元素,由数据项和数据元素之间的关系组成 在图中,共有10个结点 结点的度(Degree of Node):结点所拥有的子树的个数,在图中,结点A的度为3 树的度(Degree of Tree):树中各结点度的最大值 在图中,树的度为3 叶子结点(Leaf Node):度为0的结点,也叫终端结点 在图中,结点E、F、G、H、I、J都是叶子结点 分支结点(Branch Node):度不为0的结点,也叫非终端结点或内部结点 在图中,结点A、B、C、D是分支结点 孩子(Child):结点子树的根 在图中,结点B、C、D是结点A的孩子
常见树形结构2019-03-15鱼鱼

ELK全家桶基本使用(I)文件收集Filebeat

ELK全家桶基本使用(I)文件收集FilebeatFilebeat是Elastic中的轻量文件收集系统,相比于功能更强悍的Logstash,当我们需求很单一,读取文件内容且对文件内容没有过多复杂处理时,最好使用FileBeat取代Logstash,以免造成不必要的内存开销 文档链接 Filebeat负责收集文件并发送给下游服务 核心行为包含输入、处理过滤和输出 当然也有集成好配置的模块,通过模块与Es和Kibana链接可以直接在Kibana上看到组件的可视化 同时不难看出Filebeat其实对数据库的支持不是很健壮 截止7.6版本,开源的Filebeat可支持以下几种消息输入类型: log 用得最多的输入类型; stdin 标准的输入,从process或是piepline读取(可理解为脚本运行通道直接输入),一旦配置了这种input方式,其他 input将不再生效文档地址;
ELK全家桶基本使用(I)文件收集Filebeat2020-03-16鱼鱼

IO与NIO

IO与NIO我们都知道IO流传输,其实IO模型有很多,例如BIO、NIO、AIO等,传统的IO都是同步的 IO为各种流操作 IO操作分类 I IO操作分类 II 其中,输入流可以为InputStream和Reader,分别为字节流和字符流,对应地,输出流为OutputStream和Writer,具体的使用在此不详述 NIO是IO模型中后推出的新IO模型 NIO并不一定是多线程的,但是NIO是多管道的,利用缓冲作为中间介质进行数据传输,运用的其实是多路复用技术,它恰恰是通过减少线程数量从而减少上下文的频繁切换,提高性能 Channel:通道,相当于一个连接,不能直接输出数据,只能与Buffer交换数据
IO与NIO2019-05-11鱼鱼
网站地图
1
首页 博客 {{screen}} 第 {{page}} 页
博客索引
{{blog.createDate}} ◔ {{blog.timeline}} 小头像 {{blog.author}} {{tag}}
{{blog.likeCount}}{{blog.commentCount}}
分类下暂时没有文章哦!
主题分类
{{taggroup.label}} 

{{tag.value}}