Java 能抵挡住 JavaScript 的进攻吗?

告别专业软件!用QGIS+GDAL免费搞定S-57电子海图,附全套符号库和样式文件 本文详细介绍了如何利用免费开源工具QGIS和GDAL处理S-57电子海图,包括数据转换、符号库配置和专业可视化方案。通过实战指南,用户无需依赖昂贵的商业软件,即可实现从S-57到SHP的转换及专业级海图制作,特别适合预算有限的个人和小型机构。 阅读详情

Java 能抵挡住 JavaScript 的进攻吗?

 

JavaScript 的进攻

 

公元 2014 年,Java 第八代国王终于登上了王位。

第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力。

德高望重的 IO 大臣颤悠悠地走上前来:“启禀陛下,昨日收到战报,有个叫做 Node.js 的番邦又一次向我国进攻,我边防将士死伤惨重。”

“Node.js? 那是什么东西?” 国王心中一乐, 还真有人自不量力,想蚍蜉撼树。 想我 Java 帝国人口之众多,疆域之广阔,踩死你小番邦还不像踩死一只蚂蚁似的。

“那是用 JavaScript 写的一个框架。” IO 大臣看到国王不知道 Node.js,心里一沉。

“JavaScript?爱卿说笑了,一个在浏览器中运行的东西,怎么可能进攻我 Java 后端。”

“陛下有所不知,这 JavaScript 发展迅猛,不仅占领了前端,还通过 Node.js 向后端,尤其是我国渗透,臣还听说他们用 Electron 开始蚕食桌面开发了!”

“竟有这等事!难道他们想通吃?我们不是有 Tomcat 吗?派 Tomcat 去把 Node.js 给镇压了。”

国王开始怨恨自己的父亲 JDK 7 世和祖父 JDK 6 世没把这个 Node.js 当成一回事,没有把 Node.js 给扼杀在摇篮之中,把这个祸害留给了自己,心里开始发虚。

 

非阻塞异步 IO

 

线程大臣走上前来:“陛下,Tomcat 已经率军和 Node.js 恶战了几日,败下阵来, 这 Node.js 有个独门武器,叫做‘非阻塞异步 IO’。”

“非阻塞? 我听说我们的 Tomcat 也能实现非阻塞啊!” 国王有点惊讶。

“不行的,陛下,Tomcat 在处理连接的时候能实现非阻塞,但是在真正处理请求的时候还是需要同步操作,一个请求对应一个线程来处理,不像 Node.js 那样,都是异步操作,只有一个主线程在忙活。” 线程大臣做了一个简明扼要的汇报,不知道国王能否听懂。

 

“众位爱卿,你们说说该怎么办? 总不能让这小小番邦屡次欺负我堂堂 Java 帝国吧。”

“臣倒是有一计,” 集合大臣说道,“这 Node.js 虽然来势汹汹,但是它也有个致命的缺点,那 JavaScript 是个动态语言,无法进行编译时类型检查,错误只有等到运行时才能暴露出来。用它开发个小项目还可以,一旦项目变大,代码变多,人员变多,那就会变成噩梦了。”

“爱卿说说具体怎么办?”

“我们可以派一些卧底去 Node.js, 到处传播这样的消息,瓦解他们的军心和士气,让他们认为 Node.js 写的系统,很快就会腐化,最终还是要用我堂堂正正的 Java 语言来重写。”

“嗯,此乃心理战也,至少会稳住一些墙头草,准奏,由爱卿来安排。 ” 国王说道,“不过,此法治标不治本,还是得想办法直接把他们打败。”

“陛下真乃一代圣君,” 线程大臣马上开始拍马屁,与此同时,巧妙地把矛头转向老不死的 IO 大臣:“我 Java 帝国在第 4 代国王的时候就出现了非阻塞 IO,这么多年过去了,居然还没发展出类似 Node.js 的系统,实在是不应该啊。”

“老不死”的 IO 大臣是何等精明:“陛下明鉴, 我 Java 帝国应用服务器一直以来都是 Tomcat 独大,他们采用了线程池,每个请求一个线程的方式,我也不好干预。”

IO 大臣把责任推得一干二净。

“没错,” 集合大臣为 IO 大臣打抱不平,两肋插刀,“还有一点就是这异步编程,听起来很好,但是写起来可就要命了,那么多的回调,简直就是反人类,臣民们戏称为回调地狱,没人愿意那么写,发展不起来也很正常。”

线程大臣马上接口:“此言差矣,陛下已经教会了臣民们如何使用 Lambda 表达式,并且现在也出现了 RxJava,已经没什么回调地狱了!”

“那是现在,以前可没有!”

“......”

国王看到这几位大臣要打起来,马上施展和稀泥之术:“众位爱卿各有道理,你们且说说,怎么才能打败着来势汹汹的 Node.js 吧。”

没人说话。

国王只好退朝。

 

京城酒馆

 

京城的小酒馆向来是一个多方消息的集散地。

一个金发碧眼的小伙子正在“危言耸听”:“听说了没有,Node.js 又赢了几仗,Tomcat 大军死伤惨重,有不少臣民都投奔到那个番邦去了。”

“这异步操作真的有这么厉害?” 有人问道。

小伙子喝了一口酒: “其实不是异步操作更好,而是在高并发的环境异步操作更有效,大家都知道, 一个机器能支持的线程数目是有限的,不可能一直增加。Tomcat 那种一个请求一个线程的方式很快就会遇到瓶颈。”

“你说说,到底有什么好处?”有人刨根问底。

“现在服务器端的操作无非就是操作文件,读写数据库,访问远程服务,这些都是所谓阻塞操作。” 小伙子展开了一张图:

 

Java 能抵挡住 JavaScript 的进攻吗?

 

 

“橙色的都是 IO 操作,绿色的才是真正的线程执行, IO 操作非常耗时,线程大部分时间都浪费在了等待上面!如果能让线程不要等待,去做别的事情,那用少量的线程,甚至一个线程就可以了。”

众人纷纷点头, 这小伙子已经看出了问题的关键,现在的很多系统,都是 IO 密集的, 高并发情况下,如果一个请求一个线程,浪费巨大。

“想我 Java 虚拟机如此强悍,如果能实现异步操作,那还不把 Node.js 秒成渣?!”小伙子狠狠地用手锤了一下桌子。

正在此时,酒馆冲进一队士兵,赶走众人,围住小伙子,领头的喝问到:“大胆刁民,竟然到处宣扬异步思想,给我带走!”

士兵恶狠狠地把他五花大绑,推出门去, 留下一堆人在那里议论纷纷。

 

IO 王府

 

“我让你们把他请来,怎么绑来了?快松绑!” IO 大臣呵斥完下属,转头亲切地问道:“叫什么名字啊?”

“小人蒂姆, Tomcat 府上的幕僚。 ” 蒂姆一边说一边揉肩膀。

“Tomcat 府上的人......” IO 大臣捻着胡须若有所思。

“是的,大人,我还见过您呢,您上次半夜去 Tomcat 府上密谈......”

“住口! ” IO 大臣赶紧转换话题, “我的下属发现你到处宣扬异步思想,究竟要干什么? ”

“小人发明了一个系统,叫做 Node.x。 ”

“为什么不献于 Tomcat 将军?”

“唉,小人进言多次,可是将军不听啊!”

“你说说看,这是个什么东西? 是要模仿 Node.js 吗?” IO 大臣问道。

之前蒂姆给 Tomcat 将军讲述过 Node.js, 他理都不理,经常是一甩袖子就走, 自己是空有一身本领却无人赏识, 难道这 IO 大臣能帮自己一把? 想到此处,蒂姆精神大振。

“确实受到了它的启发, 但是我的 Node.x 在架构和一些关键的抽象上和 Node.js 有很大不同。” 蒂姆不好意思地笑了笑,“先说说相同的部分,既然都是异步操作,那肯定是通过事件驱动的,所以都有一个事件循环。”

 

Java 能抵挡住 JavaScript 的进攻吗?

 

 

IO 大臣之前和 Swing 大臣聊过, 知道事件循环是怎么回事,这是一个相当古老的概念了。

无非就是有个线程在检测一个队列,如果队列中有事件,就拿出来处理。

“只不过我这里有所不同,可以创建多个事件循环出来,比如每一个 CPU 核心有一个,这样可以充分利用 CPU 的多核性能。” 蒂姆得意地说道。

 

Java 能抵挡住 JavaScript 的进攻吗?

(4 个 CPU Core, 4 个事件循环)

 

IO 大臣点头表示赞许, 他听说 Node.js 好像只有一个主线程,没法直接利用多核的能力。想利用多核的话还得开多个进程才行。

 

异步操作

 

“你图中的那个 Hanlder 就是具体的业务代码所在地吧? 具体长什么样子啊,让我看看!” IO 大臣问道。

蒂姆赶紧呈上代码,这是简单的 Hello World。

import io.vertx.core.AbstractVerticle;
public class Server extends AbstractVerticle {
 public void start() {
 vertx.createHttpServer().requestHandler(req -> {
 req.response()
 .putHeader("content-type", "text/plain")
 .end("Hello Word!");
 }).listen(8080);
 }
}

这段代码生成了一个简单的 HTTP 服务器, 在 8080 端口监听, 每当有请求来的时候,都返回一个字符串“Hello World!”。

IO 大臣一看,大为吃惊:“你这代码不需要外部容器,自己就搞了一个 HTTP 服务器啊?”

“是的,这样我们就完全不用 Tomcat 了。我把这种类起了一个名称,叫做 Verticle, 部署以后,这个 Verticle 就可以和一个事件循环关联了。每次有 HTTP 请求过来,Node.x 会封装成事件,然后分派给它处理了。”

 

Java 能抵挡住 JavaScript 的进攻吗?

 

 

真是个二愣子, IO 大臣心想, 怪不得 Tomcat 对你不待见,你这个东西出来,他的位置不保啊!

IO 大臣问道:“那对于数据库查询,你这个 Handler,哦不,Verticle 该怎么写? 查询数据库这么慢,岂不是把事件循环都阻塞了?什么事情都做不了了?”

“大人您忘了,我们这里操作必须都是异步的,查询数据库也不例外。”

蒂姆说着展示了一段代码, 通过异步的方式来查询数据库。

public class DatabaseVerticle extends AbstractVerticle{
 ......
 dbClient.getConnection(ar -> {
 if (ar.succeeded()) {
 SQLConnection connection = ar.result();
 connection.query("select .. from...", res -> { 
 if (res.succeeded()) {
 ......
 } else {
 ......
 }
 });
 } else {
 ......
 }
 });
}

 

Java 能抵挡住 JavaScript 的进攻吗?

 

 

IO 大臣感慨道:“唉,老了,真是不中用了,连异步都忘了。对了,这些个 Verticle 看起来都是独立的,是被不同的线程调用的,他们之间怎么进行交互啊?难道也通过共享内存的方式?”

“大人真是厉害,一下子就问到了核心问题,不能让他们共享内存,那样就需要加锁了,我这里引入了 Event Bus 的方法,让他们之间通过消息传递。”

 

Java 能抵挡住 JavaScript 的进攻吗?

 

 

“嗯,不错,实现了低耦合。”

“不仅如此,这些 Verticle 还可以部署到不同的 JVM 中,通过 Event Bus 实现真正的分布式通信。” 蒂姆又抛出一个重磅炸弹。

“如此甚好!” IO 大臣爱才之心骤起, “你愿不愿意到老夫府上做幕僚啊?”

“小人愿意追随大人!”

“好!明日早朝,你随我入宫,面见圣上,老夫保你一世荣华富贵。 ”

为什么是 Vert.x?

 

第二日早朝,IO 大臣迫不及待地给国王报喜:“陛下,我 Java 帝国也可以采用非阻塞异步编程了!击败 Node.js 之日可待。”

IO 大臣讲述了昨晚的情况, 细数了 Node.x 的种种好处。

Tomcat 将军脸上极为难看, 赶紧阻止:“陛下不可,我 Java 帝国采用同步处理已经很久了,臣民们已经习惯了,现在改成异步,怕激起民变。”

“爱卿不要低估臣民采用新技术的能力嘛, 宣蒂姆进殿,呈上代码。”

蒂姆都不敢看 Tomcat, 从怀里掏出一张纸,双手奉上。

vertx.createHttpServer()
 .requestHandler(function (req) {
 req.response()
 .putHeader("content-type", "text/plain")
 .end("Hello World");
}).listen(8080);

国王盯着看了半天:“嗯?不对啊,你这不是 Java 代码吧?”

Tomcat 拿过国王递过来的代码,扫了一眼:““大胆! 你竟然敢在朝堂之上公然宣传 JavaScript,来人,拿下!”

“陛下息怒,这是小人制定的一个策略,我的 Node.x 支持很多语言编程, 除了 Java 之外,还有 JavaScript、Ruby、Scala、Kotlin 等等。”

“哦? 是吗? 这还能把番邦的人给吸引过来呢!你说呢,Tomcat 将军?” 国王说道。

Tomcat 有些不自在,想找回场子:“嗯嗯,有一定道理,不过这个 Node.x 这个名字不好,拾人牙慧,让人看低我堂堂 Java 帝国。”

“Node 是节点的意思,朕把他改成 Vertex 如何?也是节点的意思。”

“ 陛下圣明,可否叫做 Vert.x ? ” IO 大臣提议。

“好,准奏,即日起,命你和蒂姆训练臣民使用 Vert.x,一个月后向 Node.js 开战!” 国王已经忍 Node.js 很久了。

不,不能让 IO 大臣的 Vert.x 一家独大!

国王突然想到了亲爹留下来的祖训, 帝王之术是一定要平衡朝局。

“吩咐下去,今晚朕要和 Spring 将军,嗯,还有线程大臣,共进晚餐,朕有些事情要和他们好好谈谈......”

*本故事纯属虚构,如有雷同,纯属巧合。

这里是程序员秘密聚集地,各位还在架构师的道路上挣扎的小伙伴们速来。“

加QQ群:611481448(名额有限哦!)

Ubuntu声卡检测与故障排查:从基础命令到驱动修复 本文详细介绍了在Ubuntu系统中进行声卡检测与故障排查的完整流程。从使用lspci、aplay等基础命令识别硬件,到排查驱动冲突、修复权限问题,再到调整PulseAudio高级配置,提供了一套系统性的解决方案。文章结合实战案例,帮助用户快速诊断并解决Ubuntu系统常见的“无声”问题,恢复音频功能。 阅读详情

相关推荐

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6575

JavaScript中的强制

We are going to talk about Coercion in JavaScript, it is a mouthful word but still, a lot of people do not know about it even a coercion. So what is coercion in the context of JS, my answer to will be...

2万+

STM32_USB复合设备开发实战:基于CubeMX插件简化HID与CDC集成

本文详细介绍了如何使用STM32CubeMX插件简化USB复合设备开发,特别是HID与CDC的集成。通过自动处理多设备描述符融合和端点资源分配,该插件显著降低了开发复杂度,帮助工程师快速实现键盘、鼠标和虚拟串口等复合功能,提升STM32 USB开发效率。

palm99的专栏 754

java强制执行方法_如何在Monaco编辑器中强制执行JavaScript中的函数签名

我正试图让monaco-editor(v0.13.1)检查JavaScript中的函数签名 . 通过使用下面的代码,我至少得到IntelliSense来显示预期的签名,但没有显示错误:// validation settingsmonaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({noSemanticValida...

weixin_39950470的博客 3076

CoaXPress协议入门(1)---- CXP测试套件

CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准,主要用于替代之前的Camera Link协议,常见于科学相机、工业相机、医学图像、航空防务等场景。CXP是一个非对称的高速点对点串行传输协议,主要用于传输视频和静态图像,线缆多使用单条或多条同轴电缆。CXP易于集成,可以获得灵活可靠的性能,通过使用标准的同轴线缆,比如RG59 和 RG6规格(推荐使用RG6),并且图像、控制通讯、触发、电源都可以使用同一条线缆。

素手挽剑 9521

基于瑞芯微RK3562 四核 ARM Cortex-A53 + 单核 ARM Cortex-M0——Linux应用开发手册

本文主要介绍TL3562-MiniEVM评估板的AMP(Asymmetric Multi-processing)开发案例,介绍基于Linux + RT-Thread(RTOS)、Baremetal的AMP案例的开发环境搭建。

创龙,嵌入式一体化解决方案商 412

用JavaScript编写一个Java虚拟机?谈谈哗众取宠的BicaVM

今日目睹某网络新闻,开篇明义便包含如下几行文字 【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个java虚拟机BicaVM】 继而再读,惊见其中“超级大牛”、“神人”等溢美之词不绝于耳,崇拜、神往之心溢于言表。仿佛BicaVM就是天上有地下无的创举,仿佛Artur Ventura就是继比尔盖茨,乔布斯之后的第三位IT业领军人。然而很可惜,小弟今天准备要“侮辱”一...

wangxiaohigh 285

爬虫面试:关于爬虫破解验证码的13个经典面试题

​解释:验证码是一种用于区分人类用户和自动化程序(如爬虫)的技术,通常通过显示图形、文字或音频等方式,要求用户完成特定任务(如识别扭曲的字母、点击特定区域等)。​作用:防止恶意爬虫滥用网站资源、进行批量注册、登录破解等行为,保护网站的安全性和数据的完整性。

数据知道的博客 1万+

java怎么强制释放gc,JavaScript强制GC收集? /强制释放对象?

I have a js function for playing any given sound using the Audio interface (creating a new instance for every call).This works quite well, until about the 32nd call (sometimes less). This issue is dir...

weixin_39526546的博客 3465

芒果YOLO11改进176:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响

芒果YOLO11改进186:2025最新顶会论文|尺度动态损失函数Scale-based Dynamic Loss,即插即用|以减少标签不准确对损失函数稳定性的影响

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2135

某智能物流无人值守系统 ExportReport SQL注入漏洞复现

某智能物流无人值守系统 ExportReport存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

0xSec 820

[前台]---js中方法的强制返回和java中方法的强制返回

java写惯了,偶尔写个js,真是各种坑,比如方法中的return的效果就不一样: java中: public static void main(String[] args) { String[] a = {"1","2","3"}; for (String s : a) { if(s.equals("1&q

zhangsir的博客 9359

手把手教你学Simulink——基于Simulink的无感FOC(滑模观测器+PLL)实战

摘要: 本文详细介绍了基于Simulink的无感FOC(滑模观测器+PLL)实现方法。主要内容包括:1)SMO+PLL原理,通过滑模观测器估算反电动势,结合PLL抑制抖振;2)系统架构,替代编码器信号;3)Simulink建模流程,涵盖Clarke变换、SMO离散化实现、PLL设计等关键步骤;4)参数整定指南和工程实践要点,如启动策略和故障处理。该方法具有成本低、可靠性高的优势,适用于家电、电动车等场景,仿真结果显示角度误差±5°,速度动态跟随良好。文章还提供了调试建议和常见问题解决方案。

MHD0815的博客 140

Java能抵挡住JavaScript的进攻吗?

JavaScript的进攻 公元2014年,Java 第八代国王终于登上了王位。   第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力。   德高望重的IO大臣颤悠悠地走上前来:“启禀陛下,昨日收到战报,有个叫做Node.js的番邦又一次向我国进攻,我边防将士死伤惨重。”   “Node.js? 那是什么东西?”  国王心中一乐, 还真有人自不量力,想蚍...

liuyingv8的博客 573

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

PCA9422与PIC18F45K50的嵌入式电源管理方案实战解析

电源管理是嵌入式系统稳定运行的基石,尤其在核心板、便携设备和电池供电产品中,多路电压输出、上电时序、纹波控制与故障恢复直接决定系统可靠性。通常,PMIC负责功率变换与保护,MCU负责策略控制,两者结合可灵活实现动态电压调节、故障上报与日志记录。PCA9422作为多路PMIC,支持I2C配置输出电压与软启动参数,配合PIC18F45K50的状态机与USB日志能力,能够构建完整且可维护的电源子系统。本文从选型、系统架构、硬件设计、固件实现到实测排错,详细拆解基于这两颗芯片的电源管理方案,提供可直接落地的工程实践

weixin_34234721的博客 348

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java能抵挡住JavaScript的进攻吗?【转载】

JavaScript的进攻 公元2014年,Java 第八代国王终于登上了王位。 第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了皇权的威力。 德高望重的IO大臣颤悠悠地走上前来:“启禀陛下,昨日收到战报,有个叫做Node.js的番邦又一次向我国进攻,我边防将士死伤惨重。” “Node.js? 那是什么东西?”  国王心中一乐, 还真有人自不量力,想蚍蜉撼树。 想我Ja...

银剑的博客 269

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

软件巨头卧谈会

深夜时分,忙碌了一天的机房里逐渐安静下来,几个软件巨头nginx, Tomcat, Redis, Node.js又开始夜谈了。nginx伸了一个懒腰:哎哟,今天可累死我了,高峰期我居然...

码农翻身 748

网络空间安全核心全景:一张思维导图盘点必会基础与技能(建议收藏)

提到网络安全,一般人们将它看作是信息安全的一个分支,信息安全是更加广义的一个概念:防止对知识、事实、数据或能力非授权使用、误用、篡改或拒绝使用所采取的措施.

fly_enum的博客 119
上一篇: Java程序员你凭什么比.NET工资高?
下一篇: 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值