成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java能抵擋住JavaScript的進(jìn)攻嗎?

開發(fā) 開發(fā)工具
公元2014年,Java 第八代國王終于登上了王位。第一次早朝,國王坐在高高的寶座上,看著畢恭畢敬的大臣,第一次體會到了皇權(quán)的威力。

 JavaScript的進(jìn)攻

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

第一次早朝,國王坐在高高的寶座上,看著畢恭畢敬的大臣,第一次體會到了皇權(quán)的威力。

德高望重的IO大臣顫悠悠地走上前來:“啟稟陛下,昨日收到戰(zhàn)報,有個叫做Node.js的番邦又一次向我國進(jìn)攻,我邊防將士死傷慘重。”

“Node.js? 那是什么東西?” 國王心中一樂, 還真有人自不量力,想蚍蜉撼樹。 想我Java帝國人口之眾多,疆域之廣闊,踩死你小番邦還不像踩死一只螞蟻似的。

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

“JavaScript? 愛卿說笑了,一個在瀏覽器中運行的東西,怎么可能進(jìn)攻我Java后端。”

“陛下有所不知,這JavaScript發(fā)展迅猛,不僅占領(lǐng)了前端,還通過Node.js向后端,尤其是我國滲透,臣還聽說他們用Electron開始蠶食桌面開發(fā)了!”

“竟有這等事!難道他們想通吃? 我們不是有Tomcat嗎? 派Tomcat去把Node.js給鎮(zhèn)壓了。”

國王開始怨恨自己的父親JDK 7世和祖父JDK 6世沒把這個Node.js當(dāng)成一回事,沒有把Node.js給扼殺在搖籃之中,把這個禍害留給了自己,心里開始發(fā)虛。

非阻塞異步IO

線程大臣走上前來:“陛下,Tomcat已經(jīng)率軍和Node.js惡戰(zhàn)了幾日,敗下陣來, 這Node.js有個獨門武器,叫做‘非阻塞異步IO’。”

“非阻塞? 我聽說我們的Tomcat也能實現(xiàn)非阻塞啊!” 王國有點驚訝。

“不行的,陛下,Tomcat在處理連接的時候能實現(xiàn)非阻塞,但是在真正處理請求的時候還是需要同步操作,一個請求對應(yīng)一個線程來處理,不像Node.js那樣,都是異步操作,只有一個主線程在忙活。” 線程大臣做了一個簡明扼要的匯報,不知道國王能否聽懂。

(碼農(nóng)翻身老劉注: Node.js的故事請參見《Node.js: 我只需要一個店小二》)

“眾位愛卿,你們說說該怎么辦? 總不能讓這小小番邦屢次欺負(fù)我堂堂Java帝國吧。”

“臣倒是有一計,” 集合大臣說道,“這Node.js雖然來勢洶洶,但是它也有個致命的缺點,那JavaScript是個動態(tài)語言,無法進(jìn)行編譯時類型檢查,錯誤只有等到運行時才能暴露出來。用它開發(fā)個小項目還可以,一旦項目變大,代碼變多,人員變多,那就會變成噩夢了。”

“愛卿說說具體怎么辦?”

“我們可以派一些臥底去Node.js, 到處傳播這樣的消息,瓦解他們的軍心和士氣,讓他們認(rèn)為Node.js寫的系統(tǒng),很快就會腐化,最終還是要用我堂堂正正的Java語言來重寫。”

“嗯,此乃心理戰(zhàn)也,至少會穩(wěn)住一些墻頭草,準(zhǔn)奏,由愛卿來安排。 ” 國王說道,“不過,此法治標(biāo)不治本,還是得想辦法直接把他們打敗。”

“陛下真乃一代圣君,” 線程大臣馬上開始拍馬屁,與此同時,巧妙地把矛頭轉(zhuǎn)向老不死的IO大臣:“我Java帝國在第4代國王的時候就出現(xiàn)了非阻塞IO,這么多年過去了,居然還沒發(fā)展出類似Node.js的系統(tǒng),實在是不應(yīng)該啊。”

“老不死”的IO大臣是何等精明:“陛下明鑒, 我Java帝國應(yīng)用服務(wù)器一直以來都是Tomcat獨大,他們采用了線程池,每個請求一個線程的方式,我也不好干預(yù)。”

IO大臣把責(zé)任推得一干二凈。

“沒錯,” 集合大臣為IO大臣打抱不平,兩肋插刀,“還有一點就是這異步編程,聽起來很好,但是寫起來可就要命了,那么多的回調(diào),簡直就是反人類,臣民們戲稱為回調(diào)地獄,沒人愿意那么寫,發(fā)展不起來也很正常。”

線程大臣馬上接口:“此言差矣,陛下已經(jīng)教會了臣民們?nèi)绾问褂肔ambda表達(dá)式,并且現(xiàn)在也出現(xiàn)了RxJava,已經(jīng)沒什么回調(diào)地獄了!”

“那是現(xiàn)在,以前可沒有!”

“......”

國王看到這幾位大臣要打起來,馬上施展和稀泥之術(shù):“眾位愛卿各有道理,你們且說說,怎么才能打敗著來勢洶洶的Node.js吧。”

沒人說話。

國王只好退朝。

京城酒館

京城的小酒館向來是一個多方消息的集散地。

一個金發(fā)碧眼的小伙子正在“危言聳聽”:“聽說了沒有,Node.js又贏了幾仗,Tomcat大軍死傷慘重,有不少臣民都投奔到那個番邦去了。”

“這異步操作真的有這么厲害?” 有人問道。

小伙子喝了一口酒: “其實不是異步操作更好,而是在高并發(fā)的環(huán)境異步操作更有效,大家都知道, 一個機(jī)器能支持的線程數(shù)目是有限的,不可能一直增加。Tomcat那種一個請求一個線程的方式很快就會遇到瓶頸。”

“你說說,到底有什么好處?”有人刨根問底。

“現(xiàn)在服務(wù)器端的操作無非就是操作文件,讀寫數(shù)據(jù)庫,訪問遠(yuǎn)程服務(wù),這些都是所謂阻塞操作。” 小伙子展開了一張圖:

 

“橙色的都是IO操作,綠色的才是真正的線程執(zhí)行, IO操作非常耗時,線程大部分時間都浪費在了等待上面! 如果能讓線程不要等待,去做別的事情,那用少量的線程,甚至一個線程就可以了。”

眾人紛紛點頭, 這小伙子已經(jīng)看出了問題的關(guān)鍵,現(xiàn)在的很多系統(tǒng),都是IO密集的, 高并發(fā)情況下,如果一個請求一個線程,浪費巨大。

“想我Java 虛擬機(jī)如此強(qiáng)悍,如果能實現(xiàn)異步操作,那還不把Node.js秒成渣?!”小伙子狠狠地用手錘了一下桌子。

正在此時,酒館沖進(jìn)一隊士兵,趕走眾人,圍住小伙子,領(lǐng)頭的喝問到:“大膽刁民,竟然到處宣揚異步思想,給我?guī)ё?”

士兵惡狠狠地把他五花大綁,推出門去, 留下一堆人在那里議論紛紛。

IO王府

“我讓你們把他請來,怎么綁來了?快松綁!” IO大臣呵斥完下屬,轉(zhuǎn)頭親切地問道:“叫什么名字啊?”

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

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

“是的,大人,我還見過您呢,您上次半夜去Tomcat府上密談......”

“住口! ” IO大臣趕緊轉(zhuǎn)換話題, “我的下屬發(fā)現(xiàn)你到處宣揚異步思想,究竟要干什么? ”

“小人發(fā)明了一個系統(tǒng),叫做Node.x。 ”

“為什么不獻(xiàn)于Tomcat 將軍?”

“唉,小人進(jìn)言多次,可是將軍不聽啊!”

“你說說看,這是個什么東西? 是要模仿Node.js嗎?” IO大臣問道。

之前蒂姆給Tomcat將軍講述過Node.js, 他理都不理,經(jīng)常是一甩袖子就走, 自己是空有一身本領(lǐng)卻無人賞識, 難道這IO大臣能幫自己一把? 想到此處,蒂姆精神大振。

“確實受到了它的啟發(fā), 但是我的Node.x在架構(gòu)和一些關(guān)鍵的抽象上和Node.js有很大不同。” 蒂姆不好意思地笑了笑,“先說說相同的部分,既然都是異步操作,那肯定是通過事件驅(qū)動的,所以都有一個事件循環(huán)。”

 

 

[[256874]]

 

IO大臣之前和Swing大臣聊過, 知道事件循環(huán)是怎么回事,這是一個相當(dāng)古老的概念了。

無非就是有個線程在檢測一個隊列,如果隊列中有事件,就拿出來處理。

“只不過我這里有所不同,可以創(chuàng)建多個事件循環(huán)出來,比如每一個CPU核心有一個,這樣可以充分利用CPU的多核性能。” 蒂姆得意地說道。

[[256874]]

 

(4個CPU core, 4個事件循環(huán))

IO大臣點頭表示贊許, 他聽說Node.js好像只有一個主線程,沒法直接利用多核的能力。想利用多核的話還得開多個進(jìn)程才行。

異步操作

“你圖中的那個Hanlder就是具體的業(yè)務(wù)代碼所在地吧? 具體長什么樣子啊,讓我看看!” IO大臣問道。

蒂姆趕緊呈上代碼,這是簡單的Hello World。

  1. import io.vertx.core.AbstractVerticle; 
  2. public class Server extends AbstractVerticle { 
  3.   public void start() { 
  4.     vertx.createHttpServer().requestHandler(req -> { 
  5.       req.response() 
  6.         .putHeader("content-type""text/plain"
  7.         .end("Hello Word!"); 
  8.     }).listen(8080); 
  9.   } 

這段代碼生成了一個簡單的HTTP 服務(wù)器, 在8080端口監(jiān)聽, 每當(dāng)有請求來的時候,都返回一個字符串“Hello World!”。

IO大臣一看,大為吃驚:“你這代碼不需要外部容器,自己就搞了一個HTTP服務(wù)器啊?”

“是的,這樣我們就完全不用Tomcat了。 我把這種類起來一個名稱,叫做Verticle, 部署以后,這個Verticle就可以和一個事件循環(huán)關(guān)聯(lián)了。每次有HTTP請求過來,Node.x會封裝成事件,然后分派給它處理了。”

 

真是個二愣子, IO大臣心想, 怪不得Tomcat對你不待見,你這個東西出來,他的位置不保啊!

 

[[256874]]

 

IO大臣問道:“那對于數(shù)據(jù)庫查詢,你這個Handler,哦不,Verticle該怎么寫? 查詢數(shù)據(jù)庫這么慢,豈不是把事件循環(huán)都阻塞了?什么事情都做不了了?”

“大人您忘了,我們這里操作必須都是異步的,查詢數(shù)據(jù)庫也不例外。”

蒂姆說著展示了一段代碼, 通過異步的方式來查詢數(shù)據(jù)庫。

  1. public class DatabaseVerticle extends AbstractVerticle{ 
  2.     ...... 
  3.     dbClient.getConnection(ar -> { 
  4.         if (ar.succeeded()) { 
  5.             SQLConnection connection = ar.result(); 
  6.             connection.query("select .. from...", res -> {       
  7.                  if (res.succeeded()) { 
  8.                    ...... 
  9.                  } else { 
  10.                    ...... 
  11.                  } 
  12.           }); 
  13.         } else { 
  14.            ...... 
  15.         } 
  16.     }); 

 

 

[[256874]]

 

IO大臣感慨道:“唉,老了,真是不中用了,連異步都忘了。對了,這些個Verticle看起來都是獨立的,是被不同的線程調(diào)用的,他們之間怎么進(jìn)行交互啊?難道也通過共享內(nèi)存的方式?”

“大人真是厲害,一下子就問到了核心問題,不能讓他們共享內(nèi)存,那樣就需要加鎖了,我這里引入了Event Bus的方法,讓他們之間通過消息傳遞。”

 

[[256874]]

 

 

 

“嗯,不錯,實現(xiàn)了低耦合。”

“不僅如此,這些Verticle還可以部署到不同的JVM中,通過Event Bus實現(xiàn)真正的分布式通信。” 蒂姆又拋出一個重磅炸彈。

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

“小人愿意追隨大人!”

“好!明日早朝,你隨我入宮,面見圣上,老夫保你一世榮華富貴。 ”

為什么是Vert.x?

第二日早朝,IO大臣迫不及待地給國王報喜:“陛下,我Java 帝國也可以采用非阻塞異步編程了!擊敗Node.js之日可待。”

IO大臣講述了昨晚的情況, 細(xì)數(shù)了Node.x的種種好處。

Tomcat將軍臉上極為難看, 趕緊阻止:“陛下不可,我Java帝國采用同步處理已經(jīng)很久了,臣民們已經(jīng)習(xí)慣了,現(xiàn)在改成異步,怕激起民變。”

“愛卿不要低估臣民采用新技術(shù)的能力嘛, 宣蒂姆進(jìn)殿,呈上代碼。”

蒂姆都不敢看Tomcat, 從懷里掏出一張紙,雙手奉上。

  1. vertx.createHttpServer() 
  2.   .requestHandler(function (req) { 
  3.     req.response() 
  4.       .putHeader("content-type""text/plain"
  5.       .end("Hello World"); 
  6. }).listen(8080); 

國王盯著看了半天:“嗯?不對啊,你這不是Java代碼吧?”

Tomcat拿過國王遞過來的代碼,掃了一眼:““大膽! 你竟然敢在朝堂之上公然宣傳JavaScript,來人,拿下!”

“陛下息怒,這是小人制定的一個策略,我的Node.x支持很多語言編程, 除了Java之外,還有JavaScript,Ruby, Scala, Kotlin等等。”

“哦? 是嗎? 這還能把番邦的人給吸引過來呢!你說呢,Tomcat將軍?” 國王說道。

Tomcat有些不自在,想找回場子:“嗯嗯,有一定道理,不過這個Node.x這個名字不好,拾人牙慧,讓人看低我堂堂Java帝國。”

“Node是節(jié)點的意思,朕把他改成vertex如何?也是節(jié)點的意思。”

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

“好,準(zhǔn)奏,即日起,命你和蒂姆訓(xùn)練臣民使用vert.x,一個月后向Node.js開戰(zhàn)!” 國王已經(jīng)忍Node.js很久了。

不,不能讓IO大臣的Vert.x一家獨大!

國王突然想到了親爹留下來的祖訓(xùn), 帝王之術(shù)是一定要平衡朝局。

“吩咐下去,今晚朕要和Spring將軍,嗯,還有線程大臣,共進(jìn)晚餐,朕有些事情要和他們好好談?wù)?.....”

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】

 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2019-01-29 14:25:39

2011-03-22 17:11:13

JavaLAMP

2013-03-28 10:08:04

Amazon云計算IBM

2011-11-14 15:33:04

2018-01-31 13:48:43

2023-09-04 08:28:34

JavaScripforEach 循環(huán)

2019-12-17 15:18:52

網(wǎng)絡(luò)安全數(shù)據(jù)技術(shù)

2023-08-11 17:13:39

JavaScrip

2011-06-01 10:24:29

PlayBookBlackBerry

2010-06-21 10:09:47

Java

2015-09-21 09:23:50

2020-12-03 06:21:06

Java指令重排序

2011-08-22 20:38:12

2013-09-22 12:48:59

2010-09-01 15:30:46

2013-05-09 10:02:13

Unix服務(wù)器x86

2016-12-05 17:24:50

2024-01-16 16:39:33

2013-11-11 13:55:56

移動社交游戲微信游戲

2015-08-07 10:06:26

加班編程熱情
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 综合久久久久 | 国产成人精品一区二三区在线观看 | 羞羞午夜 | 国产精品视频yy9299一区 | 久久婷婷色 | 日韩成人中文字幕 | 久久久影院 | 91精品国产一二三 | 亚洲国产成人av好男人在线观看 | 一区二区三区四区日韩 | 国产二区精品视频 | 99视频在线免费观看 | 天天爱av | 国产999精品久久久久久 | 国产成人精品一区二区三区 | 欧美白人做受xxxx视频 | 日韩欧美一区二区三区免费观看 | 日韩欧美一区二区三区免费观看 | 日韩中文字幕一区 | 久久精品欧美一区二区三区麻豆 | 一区二区在线看 | 黄色网址在线免费播放 | 亚洲精品1区 | 色综合色综合色综合 | 一级欧美黄色片 | 精品福利在线 | 亚洲在线免费观看 | 精品一区国产 | 综合色站导航 | 成人免费淫片aa视频免费 | 91久久久精品国产一区二区蜜臀 | 在线观看成年视频 | 久久亚洲精品久久国产一区二区 | 久久成人国产 | 中文字幕乱码一区二区三区 | 福利色导航| 九九热这里只有精品在线观看 | 国内自拍偷拍 | 欧美大片一区 | 青青久在线视频 | h片在线观看网站 |