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源码分析——请求原理分析(中)>.在& ...
随机推荐
- 基于 IntersectionObserver 实现一个组件的曝光监控
我们在产品推广过程中,经常需要判断用户是否对某个模块感兴趣.那么就需要获取该模块的曝光量和用户对该模块的点击量,若点击量/曝光量越高,说明该模块越有吸引力. 那么如何知道模块对用户是否曝光了呢?之前我 ...
- Docker学习(7) 构建镜像
构建docker镜像 1 构建镜像的两种方式 1 通过容器构建镜像 2 通过Dockerfile构建镜像
- TVM Reduction降低算力
TVM Reduction降低算力 这是有关如何降低算力TVM的介绍材料.像sum / max / min这样的关联约简运算符是线性代数运算的典型构造块. 本文将演示如何降低TVM算力. from _ ...
- ffmpeg architecture(上)
ffmpeg architecture(上) 目录 介绍 视频-您看到的是什么! 音频-您在听什么! 编解码器-缩小数据 容器-音频和视频的舒适场所 FFmpeg-命令行 FFmpeg命令行工具101 ...
- Python 5种方法实现单例模式
基本介绍 一个对象只允许被一次创建,一个类只能创建一个对象,并且提供一个全局访问点. 单例模式应该是应用最广泛,实现最简单的一种创建型模式. 特点:全局唯一,允许更改 优缺点 优点: 避免对资源的多重 ...
- 【NX二次开发】多种变换
变换的种类: uf5942 矩阵乘积变换 uf5943 平移变换 uf5944 缩放变换 uf5945 旋转变换 uf5946 镜像变换 最后使用 uf5947 实现uf5942-uf5946的变换. ...
- Zab协议 (史上最全)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 「10.28」Dove 打扑克(链表)·Cicada 与排序(概率)·Cicada 拿衣服(各种数据结构)
A. Dove 打扑克 考场思考半天线段树树状数组,没有什么想法 打完暴力后突然想到此题用链表实现会很快. 因为只有$n$堆,所以设最多有$x$个不同的堆数,那么$x\times (x-1)/2==n ...
- C#中怎样使控件随着窗体一起变化大小
此文原作者为CSDN的 zhouwen5288,原文链接 http://blog.csdn.net/zhouwen5288/article/details/6493835 本人仅作为随笔备忘,转载请 ...
- DOS命令行(10)——reg/regini-注册表编辑命令行工具
注册表的介绍 注册表(Registry,台湾.港澳译作登錄檔)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息. 1. 数据结构 注册表由键(key,或称 ...