ARTS第十三周(阅读Tomcat源码)
1.Algorithm:每周至少做一个 leetcode 的算法题
2.Review:阅读并点评至少一篇英文技术文章
3.Tip:学习至少一个技术技巧
4.Share:分享一篇有观点和思考的技术文章
考研真难 , 卷的厉害 , 还能怎么着 . 接着熬 , 继续更新
以下是各项的情况:
Algorithm
链接:[LeetCode-442]-Find All Duplicates in an Array
题意:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
分析:
以前做过一个类似题目 , 用hashmap 做一个对照词典 , 有重复的就返回
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet dictionary = new HashSet<Integer>();
for (int num:nums){
if(dictionary.contains(num)){
return num;
}
dictionary.add(num);
} return -1;
}
}
照着做就完事
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> res = new ArrayList<>(); if (nums == null || nums.length == 0) {
return res;
} // 一样的hash
for (int i = 0; i < nums.length; i++) {
while (nums[nums[i] - 1] != nums[i]) {
swap(nums, i, nums[i] - 1);
}
} // 词典记录不重复
for (int i = 0; i < nums.length; i++) {
if (nums[i] != i + 1) {
res.add(nums[i]);
}
}
return res;
} public void swap(int[] arr, int index1, int index2) {
int tmp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = tmp;
}
}
Review
很多 归纳一下就是 :
始终严格的浮点语义、外部函数和内存 API 以及伪随机数生成器的统一 API
功能包括 :
特定于上下文的反序列化过滤器支持 (允许应用程序通过调用 JVM 范围的过滤器工厂来配置特定于上下文和动态选择的反序列化过滤器),这是一项安全增强 (反序列化过滤器被引入Java 9使应用程序和库代码能够在反序列化之前验证传入的数据流。此代码java.io.ObjectInputFilter
在创建反序列化流时提供验证逻辑。但是,依赖流的创建者来明确请求验证有局限性。JDK Enhancement Proposal 290通过引入可通过 API、系统属性或安全属性设置的 JVM 范围的反序列化过滤器解决了这些限制,但这种方法也有局限性,尤其是在复杂的应用程序中。更好的方法是配置每个流过滤器,这样它们就不需要每个流创建者的参与。always-strict 浮点语义的恢复,浮点运算将变得始终严格)
模式匹配 switch 语句 (switch
针对多个模式测试表达式和语句,每个模式都有特定的操作。 引入两种模式:guarded patterns
,允许模式匹配逻辑用任意布尔表达式和 parenthesized patterns . 在JDK 16 中,
)instanceof
运算符被扩展为采用类型模式并执行模式匹配。提议的适度扩展允许简化熟悉的 instanceof-and-cast 习语。
删除远程方法调用 (RMI) 激活机制 (同时保留 RMI 的其余部分。RMI 激活机制已过时和废弃,在JDK 15 中不推荐使用。)
增强的伪随机数生成器将为伪随机数生成器 (PRNG) 提供新的接口类型和实现,包括可跳转的 PRNG 和额外的一类可拆分 PRNG 算法 (LXM)。新接口RandomGenerator
将为所有现有的和新的 PRNG 提供统一的 API。将提供四个专门的 RandomGenerator 接口。推动该计划的重点是 Java 伪随机数生成领域的多个改进领域。 该计划的目标包括:
- 使在应用程序中交替使用各种 PRNG 算法变得更容易。
- 改进了对基于流的编程的支持,提供了 PRNG 对象流。
- 消除现有 PRNG 类中的代码重复。
- 保留类的现有行为
java.util.Random
。
还有些其他的 就不翻译了.
Tip
这几天朋友问了个问题: 请求一个网站很久超时,对应后台接口作用是导出大量数据的接口应用,请求导出一大批数据要执行很久,但是 http 等待到限制的时间后,链接就会断开并显示请求超时 , 而后台应用是一个子线程在处理 ,这时候这个子线程是随着链接断开而结束呢还是继续做完未完成任务 ? (我浏览器请求后台服务,后台执行很长时间,但是浏览器请求超时了,这时候,后台服务还没执行完,该子线程如何处理?继续还是?)
我很快回答了:看策略,设定的失败处理。同步就挂起等待 , 异步看你处理逻辑怎么写的。要写销毁就销毁 等待就挂起 。
很快朋友就追问:那默认的Tomcat策略是什么?
这难倒我了,平常业务都是自己写失败处理。不过,要让我们自己@override写失败处理,我猜默认的应该很辣鸡,Tomcat要是处理的好,就不会有rocketMQ用守护线程轮询对应线程强制结束了。所以首先我先大胆猜:继续执行,但是返回数据没对应的接受,所以一般自己处理都会轮询对应线程未响应直接销毁,然后等下次响应。
不过猜的不算数,我想看看原本的策略是什么? 于是首先发现很有意思的问题 现在用的 springboot,cloud 都是用 maven 或者 gradle ,都是集成了 Tomcat 的 。那么现在用的 maven 3.6 对应的 Tomcat 版本是多少 ?它的对应关系怎么样 ? http://tomcat.apache.org/whichversion.html 查询
再查询 http://maven.apache.org/docs/history.html
很有趣,得出结论 tomcat版本与maven版本没有直接的关系,tomcat是java写的一个web容器,maven是java写的一个项目,他们都需要Java环境运行 。 再继续我们的问题 ,对应的 Tomcat 处理策略是哪个包 ?
如果有看的读者 可以自己去尝试阅读阅读源码 , 提高能力 。 这里我不多BB直接给答案:
1. tomcat 8 消息处理 从org.apache.tomcat.util.net.JIoEndpoint$Acceptor#run 开始 , socket处理 就是记录在日志里
2. 然后再去getWorkerThread().assign(socket) 分了两部 先在线程池取一个线程启动 再去assign(socket)分配socket , 用了同步锁
3.再去IoEndpoint$Worker#run
抛异常才结束
果然我的猜测是正确的 。默认就是等待挂起睡1000ms,后台继续跑着 , 除非异常 比如后台跑时间太久 内存溢出 记到日志文件里 然后close soctet
Share
暂时没找到合适的 , 迟点再补 .
ARTS第十三周(阅读Tomcat源码)的更多相关文章
- 如何阅读Java源码 阅读java的真实体会
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
- 如何阅读Java源码
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...
- 【Tomcat源码学习】-1.概述
Tomcat是用java语言开发的一个Web服务器,最近花了差不多两周时间对Tomcat 9.0源码进行了一遍学习,由于知识储备有限,也只是理解了一个大概,下面就由我来给大家分享一下我对Tomcat的 ...
- 75篇关于Tomcat源码和机制的文章
75篇关于Tomcat源码和机制的文章 标签: tomcat源码机制 2016-12-30 16:00 10083人阅读 评论(1) 收藏 举报 分类: tomcat内核(82) 版权声明:本文为 ...
- Tomcat源码分析之—组件启动实现分析
Tomcat由多个组件组成,那么Tomcat是怎么对他们的生命周期进行管理的么,这里将从Tomcat源码去分析其生命周期的实现: Bootstrape类为Tomcat的入口,所有的组件够通过实现Lif ...
- Tomcat源码学习
Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...
- Tomcat源码分析——Session管理分析(下)
前言 在<TOMCAT源码分析——SESSION管理分析(上)>一文中我介绍了Session.Session管理器,还以StandardManager为例介绍了Session管理器的初始化 ...
- Tomcat源码分析——Session管理分析(上)
前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...
- Tomcat源码分析——请求原理分析(下)
前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...
随机推荐
- VMware ESXi 7.0 U2 SLIC & Unlocker Intel NUC 专用镜像
构建 Nano Datacenter 的两大平台 在测试环境或者家庭实验室(Home lab)中使用 VMware vSphere 作为虚拟化平台非常普遍,笔者更倾向使用 Nano Datacente ...
- SSM框架的配置整合(包含配置文件代码)
由于SSM框架学习都要去网上或者以前的项目拷贝相同的代码,所以我在此把自己用到的配置文件全放在这里,帮助自己,帮助别人 首先开始前导入依赖和处理静态资源导出问题 <dependencies> ...
- 解决了一个java服务线程退出的问题
问题背景 早上才上班,测试就提了一个问题:"昨天所有批量任务都没有跑".我看了一下任务监控页面,任务是有生成的,但却一直在等待调度状态.初步怀疑是我们的调度服务问题,于是上去查 ...
- Tomcat 服务器轻松部署 SSL 证书
Tomcat 服务器 SSL 证书安装部署 1准备服务器 购买网上各个产家的云服务器 或者在自己的电脑上装虚拟机 二者皆可,建议选择第一种,因为操作起来相对方便 2安装JDK 2.1上传JDK到Lin ...
- TVM优化GPU机器翻译
TVM优化GPU机器翻译 背景 神经机器翻译(NMT)是一种自动化的端到端方法,具有克服传统基于短语的翻译系统中的弱点的潜力.最近,阿里巴巴集团正在为全球电子商务部署NMT服务. 将Transform ...
- BTC芯片介绍
BTC芯片介绍 Innosilicon宣布全球第一和最佳的28nm比特币ASIC和参考矿机 A1Craft(也称为A1)是2013年世界上最好的BTC ASIC,这是比特币区块哈希算法的易于使用,定制 ...
- TensorFlow损失函数
TensorFlow损失函数 正如前面所讨论的,在回归中定义了损失函数或目标函数,其目的是找到使损失最小化的系数.本文将介绍如何在 TensorFlow 中定义损失函数,并根据问题选择合适的损失函数. ...
- MindSpore应用目标
MindSpore应用目标 以下将展示MindSpore近一年的高阶计划,会根据用户的反馈诉求,持续调整计划的优先级. 总体而言,会努力在以下几个方面不断改进. 1. 提供更多的预置模型支持. 2. ...
- 利用NVIDIA-NGC中的MATLAB容器加速语义分割
利用NVIDIA-NGC中的MATLAB容器加速语义分割 Speeding Up Semantic Segmentation Using MATLAB Container from NVIDIA NG ...
- java接口类
是什么:类似于java中的继承,但是继承只可以继承一个人父类,接口类可以继承多个 作用:解决java继承解决不了的问题 关键字:interface(定义) implements(使用) 注意事项:1. ...