Tomcat如何進(jìn)行并發(fā)編程

這篇文章主要講解了“Tomcat如何進(jìn)行并發(fā)編程”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Tomcat如何進(jìn)行并發(fā)編程”吧!

創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),成都品牌網(wǎng)站建設(shè),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計(jì),建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價(jià)格優(yōu)惠,收費(fèi)合理。

首先是最常用的synchronized

在容器的啟動(dòng)流程中,會(huì)從Server開始一直向到各個(gè)下層容器進(jìn)行啟動(dòng),下面的代碼是Server找到配置的Service,進(jìn)行遍歷啟動(dòng)

private final Object servicesLock = new Object();

// Start our defined Services

       synchronized(servicesLock) {

           for (int i = 0; i < services.length; i++) {

               services[i].start();

           }

       }

其次,是鎖范圍的減小

service的啟動(dòng)過(guò)程,其實(shí)是這樣的

 protected void startInternal() throws LifecycleException {

               // Start our defined Container first

               if (container != null) {

                   synchronized(container) {

                       container.start();

                   }

               }

               synchronized(executors) {

                   for (Executor executor: executors) {

                       executor.start();

                   }

               }

           }

上面的代碼,我們看到,并不是整個(gè)方法進(jìn)行加鎖,而是對(duì)于各個(gè)容器內(nèi)組件的啟動(dòng)進(jìn)行分別加鎖。這種對(duì)于鎖作用范圍和持有時(shí)間的縮小,可以降低鎖競(jìng)爭(zhēng),提升可伸縮性。當(dāng)然,如果說(shuō)所有的內(nèi)容都分別加鎖反而會(huì)影響性能。感興趣的朋友可以閱讀Java并發(fā)編程實(shí)戰(zhàn)的性能與可伸縮性一章,了解更多內(nèi)容。

線程池啟動(dòng)容器內(nèi)組件

// Start our child containers, if any

Container children[] = findChildren();

List<Future<Void>>results = new ArrayList<>();

for (int i = 0; i < children.length; i++) {

    results.add(startStopExecutor.submit(new StartChild(children[i])));

}

boolean fail = false;

for (Future<Void> result : results) {

    try {

        result.get();

    } catch (Exception e) {

 }}

各個(gè)容器獲取到其子組件后,將其組裝成一個(gè)任務(wù),提交到任務(wù)執(zhí)行線程池中。任務(wù)的執(zhí)行結(jié)果,在通過(guò)其Future對(duì)象獲取。

通過(guò)Callable封裝帶返回值的任務(wù)

private static class StartChild implements Callable<Void> {

        private Container child;

        public StartChild(Container child) {

            this.child = child;

        }

        public Void call() throws LifecycleException {

            child.start();

            return null;

   } }

由于組件的啟動(dòng)并不需要返回值,此處使用Void類型,可以在實(shí)際使用過(guò)程中換成具體的值返回具體的結(jié)果。在全部任務(wù)執(zhí)行完成后,從Future中g(shù)et返回值。

Volatile的使用

  private volatileboolean close = false;

  // Time to terminate?

       if (close) {

          timeout(0, false);

       try {

            selector.close();

       } catch (IOException ioe) {

  }

通過(guò)使用volatile值,來(lái)保證多線程環(huán)境中關(guān)閉標(biāo)識(shí)的可見性,從而能正確的在標(biāo)識(shí)改變后退出特定邏輯。

wait/notify的使用

在前面的概念中,我們提到使用wait/notify的時(shí)候,一定要在拿到鎖的情況下進(jìn)行。Tomcat在進(jìn)行Servlet實(shí)例allocate和deallocate的時(shí)候,會(huì)使用到這兩個(gè)操作。

      synchronized (instancePool)

         while (countAllocated.get() >= nInstances) {

             if (nInstances < maxInstances) {

                 instancePool.push(loadServlet());

                 nInstances++;

             } else {

                 instancePool.wait();

             }

   }

卸載的時(shí)候,代碼是這樣的

         synchronized (instancePool){

             countAllocated.decrementAndGet();

             instancePool.push(servlet);

             instancePool.notify();

         }

兩種情況都是先拿到鎖再進(jìn)行的。

當(dāng)然,Tomcat中也有許多對(duì)JDK并發(fā)包內(nèi)組件的使用,像下面這個(gè)對(duì)于CountDownLatch的使用

private volatile CountDownLatchstopLatch = null; 

 stopLatch = new CountDownLatch(pollerThreadCount); // 在Endpoint進(jìn)行bind操作時(shí),設(shè)置相應(yīng)poller數(shù)量的CountDownLatch

// 在處理destory時(shí),進(jìn)行countDown操作,后續(xù)的關(guān)閉操作,會(huì)根據(jù)stopLatch的數(shù)據(jù)進(jìn)行等待操作。

stopLatch.countDown();

感謝各位的閱讀,以上就是“Tomcat如何進(jìn)行并發(fā)編程”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Tomcat如何進(jìn)行并發(fā)編程這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

本文名稱:Tomcat如何進(jìn)行并發(fā)編程
URL標(biāo)題:http://bm7419.com/article22/jdidjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名網(wǎng)站維護(hù)、搜索引擎優(yōu)化、網(wǎng)站建設(shè)網(wǎng)站設(shè)計(jì)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名