<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    經(jīng)驗(yàn)不在于年限,在于積累---專注互聯(lián)網(wǎng)軟件開(kāi)發(fā)

    把工作當(dāng)事業(yè)做,把項(xiàng)目當(dāng)作品做!

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      55 Posts :: 0 Stories :: 66 Comments :: 0 Trackbacks
    (友情提示:本博文章歡迎轉(zhuǎn)載,但請(qǐng)注明出處:陳新漢,http://www.tkk7.com/hankchen
    一、并發(fā)集合類的選擇

        同步的集合類HashtableVector,以及同步的包裝器類Collections.synchronizedMapCollections.synchronizedList,為MapList提供了基本的有條件的線程安全的實(shí)現(xiàn)。然而,某些因素使得它們并不適用于具有高度并發(fā)性的應(yīng)用程序中――它們的集合范圍的單鎖特性對(duì)于可伸縮性來(lái)說(shuō)是一個(gè)障礙,而且,很多時(shí)候還必須在一段較長(zhǎng)的時(shí)間內(nèi)鎖定一個(gè)集合,以防止出現(xiàn)ConcurrentModificationExceptions異常。

    ConcurrentHashMapCopyOnWriteArrayList實(shí)現(xiàn)提供了更高的并發(fā)性,同時(shí)還保住了線程安全性,只不過(guò)在對(duì)其調(diào)用者的承諾上打了點(diǎn)折扣。ConcurrentHashMapCopyOnWriteArrayList并不是在您使用HashMapArrayList的任何地方都一定有用,但是它們是設(shè)計(jì)用來(lái)優(yōu)化某些特定的公用解決方案的。許多并發(fā)應(yīng)用程序?qū)膶?duì)它們的使用中獲得好處。

    總結(jié):在多線程并發(fā)情況下,為了避免ConcurrentModificationExceptions異常,建議使用ConcurrentHashMapCopyOnWriteArrayList

    還有下面的幾個(gè)可以考慮:ConcurrentLinkedQueue、CopyOnWriteArraySet、LinkedBlockingQueue、ArrayBlockingQueue
     

    二、高效的乘除運(yùn)算

    服務(wù)器計(jì)算時(shí),對(duì)于乘除運(yùn)算,采用下面的方式:

    A*2=a<<1

    A/2=a>>1

    這樣可以提高運(yùn)算效率。

     

    三、原子自增器

    多線程環(huán)境下, AtomicInteger 可用在應(yīng)用程序中(如以原子方式增加的計(jì)數(shù)器),并且不能用于替換Integer。但是,此類確實(shí)擴(kuò)展了 Number,允許那些處理基于數(shù)字類的工具和實(shí)用工具進(jìn)行統(tǒng)一訪問(wèn)。

    例如:

        private AtomicInteger bomdIdCreator = new AtomicInteger(); //自增序列號(hào)

        /**

         *得到新的炸彈ID,保持自增

         *@return

         */

        public int getNewBombID(){

             return bomdIdCreator.addAndGet(1);

    }

    四、多線程鎖機(jī)制實(shí)現(xiàn)

    多線程環(huán)境下,為了避免資源競(jìng)爭(zhēng),引入了鎖機(jī)制。一般實(shí)現(xiàn)鎖機(jī)制有下面幾種方法:

    1. 同步方法、同步塊:synchronized

    2. 監(jiān)視器方法:(waitnotifynotifyAll

    3. ReentrantLock 

    注意:ReentrantLock是一個(gè)可重入的互斥鎖
    Lock,它具有與使用 synchronized 方法和語(yǔ)句所訪問(wèn)的隱式監(jiān)視器鎖相同的一些基本行為和語(yǔ)義,但功能更強(qiáng)大。

    例如:建議總是立即實(shí)踐,使用 lock 塊來(lái)調(diào)用 try,在之前/之后的構(gòu)造中,最典型的代碼如下:

     class X {

       private final ReentrantLock lock = new ReentrantLock();

       // ...

       public void m() {

         lock.lock(); // block until condition holds

         try {

           // ... method body

         } finally {

           lock.unlock()

         }

       }

     }

     

    五、線程池的實(shí)現(xiàn)方式

    Doug Lea 編寫(xiě)了一個(gè)優(yōu)秀的并發(fā)實(shí)用程序開(kāi)放源碼庫(kù) util.concurrent,它包括互斥、信號(hào)量、諸如在并發(fā)訪問(wèn)下執(zhí)行得很好的隊(duì)列和散列表之類集合類以及幾個(gè)工作隊(duì)列實(shí)現(xiàn)。該包中的 ThreadPoolExecutor類是一種有效的、廣泛使用的以工作隊(duì)列為基礎(chǔ)的線程池的正確實(shí)現(xiàn)。您無(wú)須嘗試編寫(xiě)您自己的線程池,這樣做容易出錯(cuò),相反您可以考慮使用 util.concurrent中的一些實(shí)用程序。

    線程池可以解決兩個(gè)不同問(wèn)題:由于減少了每個(gè)任務(wù)調(diào)用的開(kāi)銷(xiāo),它們通常可以在執(zhí)行大量異步任務(wù)時(shí)提供增強(qiáng)的性能,并且還可以提供綁定和管理資源(包括執(zhí)行集合任務(wù)時(shí)使用的線程)的方法。

    強(qiáng)烈建議程序員使用較為方便的Executors工廠方法Executors.newCachedThreadPool()(無(wú)界線程池,可以進(jìn)行自動(dòng)線程回收)、Executors.newFixedThreadPool(int)(固定大小線程池)和Executors.newSingleThreadExecutor()(單個(gè)后臺(tái)線程),它們均為大多數(shù)使用場(chǎng)景預(yù)定義了設(shè)置。

    例如:

    public class ThreadPoolExecutorTest {

        final static ExecutorService threadPool=Executors.newCachedThreadPool(); //簡(jiǎn)單線程池實(shí)現(xiàn)

        /**

         * @param args

         */

        public static void main(String[] args) {

           for(int i=0;i<10;i++){

               threadPool.execute(new Runnable(){

                  public void run() {

                      System.out.println("aaa"+this.getClass().getName());

                      //do other things

                  }

               });

           }

        }

    }

     

    六、實(shí)現(xiàn)定時(shí)任務(wù)的幾種方式比較

    1. 使用原始的Timer

    2.  ScheduledThreadPoolExecutor JDK 1.5新增)

    3.  Quatz開(kāi)源項(xiàng)目

    Java 5.0開(kāi)始,java.util.concurrent包中增加了一個(gè)ScheduledThreadPoolExecutor類,用來(lái)實(shí)現(xiàn)定時(shí)任務(wù)和線程池的管理,比起Timer簡(jiǎn)陋的實(shí)現(xiàn)是要強(qiáng)大得多。利用ScheduledThreadPoolExecutorscheduleAtFixedRate()scheduleWithFixedDelay()兩個(gè)方法就可以實(shí)現(xiàn)任務(wù)調(diào)度的基本功能,從前用Timer實(shí)現(xiàn)的功能應(yīng)該要遷移到scheduleWithFixedDelay()上了。

    注意:ScheduledThreadPoolExecutor是實(shí)現(xiàn)ScheduledExecutorService接口的具體類。

    1)public static final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(2);
    2)public static final ScheduledThreadPoolExecutor scheduledExecutor=new ScheduledThreadPoolExecutor(2);
    這兩種方式是一樣的,都是得到一個(gè)可調(diào)度的線程池。

     

    ScheduledThreadPoolExecutorTimer的區(qū)別:

    1.      Timer的主要方法有:

    // 安排在指定的時(shí)間執(zhí)行

    void schedule(TimerTask task, Date time)

    // 安排在指定的時(shí)間開(kāi)始以重復(fù)的延時(shí)執(zhí)行

    void schedule(TimerTask task, Date firstTime, long period)

    // 安排在指定的延遲后執(zhí)行

    void schedule(TimerTask task, long delay)

    // 安排在指定的延遲后開(kāi)始以重復(fù)的延時(shí)執(zhí)行

    void schedule(TimerTask task, long delay, long period)

    // 安排在指定的時(shí)間開(kāi)始以重復(fù)的速率執(zhí)行

    void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

    // 安排在指定的延遲后開(kāi)始以重復(fù)的速率執(zhí)行

    void scheduleAtFixedRate(TimerTask task, long delay, long period)

     

    注:重復(fù)的延時(shí)重復(fù)的速率的區(qū)別在于,前者是在前一個(gè)任務(wù)的執(zhí)行結(jié)束后間隔period時(shí)間再開(kāi)始下一次執(zhí)行;而scheduleAtFixedRate則是會(huì)盡量按照任務(wù)的初始時(shí)間來(lái)按照間隔period時(shí)間執(zhí)行。如果一次任務(wù)執(zhí)行由于某些原因被延遲了,用schedule()調(diào)度的后續(xù)任務(wù)同樣也會(huì)被延遲,而用scheduleAtFixedRate()則會(huì)快速的開(kāi)始兩次或者多次執(zhí)行,是后續(xù)任務(wù)的執(zhí)行時(shí)間能夠趕上來(lái)。

     

    2.      ScheduledThreadPoolExecutor的主要方法:

    // 在指定的延遲后執(zhí)行

    <V>ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)

    // 在指定的延遲后執(zhí)行

    ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)

    // 在指定的延遲后以固定速率執(zhí)行(類似Timer.scheduleAtFixedRate())

    ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

    // 在指定的延遲后以固定間隔執(zhí)行(類似Timer.schedule())

    ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

     

    比較:

    1Timer對(duì)調(diào)度的支持是基于絕對(duì)時(shí)間的,因此任務(wù)對(duì)系統(tǒng)時(shí)間的改變是敏感的;而ScheduledThreadPoolExecutor支持相對(duì)時(shí)間。

    2Timer使用單線程方式來(lái)執(zhí)行所有的TimerTask,如果某個(gè)TimerTask很耗時(shí)則會(huì)影響到其他TimerTask的執(zhí)行;而ScheduledThreadPoolExecutor則可以構(gòu)造一個(gè)固定大小的線程池來(lái)執(zhí)行任務(wù)。

    3Timer不會(huì)捕獲由TimerTask拋出的未檢查異常,故當(dāng)有異常拋出時(shí),Timer會(huì)終止,導(dǎo)致未執(zhí)行完的TimerTask不再執(zhí)行,新的TimerTask也不能被調(diào)度;ScheduledThreadPoolExecutor對(duì)這個(gè)問(wèn)題進(jìn)行了妥善的處理,不會(huì)影響其他任務(wù)的執(zhí)行。

    結(jié)論:Timer有這么多的缺點(diǎn),如果是使用JDK1.5以上的話,應(yīng)該沒(méi)什么理由要使用Timer來(lái)進(jìn)行調(diào)度。
    (友情提示:本博文章歡迎轉(zhuǎn)載,但請(qǐng)注明出處:陳新漢,http://www.tkk7.com/hankchen

    posted on 2009-12-30 16:54 hankchen 閱讀(2714) 評(píng)論(1)  編輯  收藏 所屬分類: 學(xué)習(xí)心得

    Feedback

    # re: Java 5.0 高性能程序開(kāi)發(fā)總結(jié)(不斷補(bǔ)充) 2010-01-05 11:31 x3
    一:
    ConcurrentHashMap和CopyOnWriteArrayList
    是否可以完全替代Collections.synchronizedMap和Collections.synchronizedList ?
    二:感覺(jué)差不了多少,還降低了代碼可讀性,除非你們公司都是做C的  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 无码不卡亚洲成?人片| 免费看一级做a爰片久久| 亚洲中文字幕久久精品无码2021| 中文毛片无遮挡高潮免费| 亚洲av无码专区在线电影| 在线A亚洲老鸭窝天堂| 国产精品免费观看| aⅴ在线免费观看| 抽搐一进一出gif免费视频| 亚洲乱码卡一卡二卡三| 亚洲热线99精品视频| 全免费一级毛片在线播放| 国产免费MV大全视频网站| 精品亚洲AV无码一区二区| 亚洲影院天堂中文av色| 亚洲成AV人片天堂网无码| 好男人视频社区精品免费| 午夜免费啪视频在线观看 | 中文字幕精品亚洲无线码一区应用| 亚洲精品第一国产综合境外资源 | 亚洲熟妇AV日韩熟妇在线| 亚洲一区二区三区高清不卡| 亚洲综合日韩中文字幕v在线| 又粗又硬又黄又爽的免费视频 | 免费国产99久久久香蕉| 精品国产亚洲一区二区三区在线观看| 亚洲美女激情视频| 亚洲男同帅GAY片在线观看| 亚洲欧洲日韩不卡| 国产成人A亚洲精V品无码| 亚洲成AV人在线观看天堂无码| 亚洲高清美女一区二区三区| 亚洲日产乱码一二三区别| 亚洲一区免费视频| 亚洲日韩看片无码电影| 一区免费在线观看| 久久亚洲精品无码av| 中国一级特黄的片子免费 | 国产免费A∨在线播放| 中文字幕免费在线| 三年片在线观看免费大全电影 |