真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁設(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)過程,其實(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)行加鎖,而是對于各個(gè)容器內(nèi)組件的啟動(dòng)進(jìn)行分別加鎖。這種對于鎖作用范圍和持有時(shí)間的縮小,可以降低鎖競爭,提升可伸縮性。當(dāng)然,如果說所有的內(nèi)容都分別加鎖反而會(huì)影響性能。感興趣的朋友可以閱讀Java并發(fā)編程實(shí)戰(zhàn)的性能與可伸縮性一章,了解更多內(nèi)容。

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

// Start our child containers, if any

Container children[] = findChildren();

List>results = new ArrayList<>();

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

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

}

boolean fail = false;

for (Future result : results) {

    try {

        result.get();

    } catch (Exception e) {

 }}

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

通過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í)際使用過程中換成具體的值返回具體的結(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) {

  }

通過使用volatile值,來保證多線程環(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中也有許多對JDK并發(fā)包內(nèi)組件的使用,像下面這個(gè)對于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)過本文的學(xué)習(xí)后,相信大家對Tomcat如何進(jìn)行并發(fā)編程這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


文章名稱:Tomcat如何進(jìn)行并發(fā)編程
分享鏈接:http://weahome.cn/article/jdidjc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部