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

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

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

    隨筆-295  評論-26  文章-1  trackbacks-0

    多線程設計要點

    板橋里人 http://www.jdon.com 2002/01/10

    ?

    1 .多線程中有主內存和工作內存之分, 在JVM中,有一個主內存,專門負責所有線程共享數據;而每個線程都有他自己私有的工作內存, 主內存和工作內存分貝在JVM的stack區和heap區。

    2. 線程的狀態有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'幾個狀態,
    'Ready' 表示線程正在等待CPU分配允許運行的時間。

    3. 線程運行次序并不是按照我們創建他們時的順序來運行的,CPU處理線程的順序是不確定的,如果需要確定,那么必須手工介入,使用setPriority()方法設置優先級。

    4. 我們無從知道一個線程什么時候運行,兩個或多個線程在訪問同一個資源時,需要synchronized

    5. 每個線程會注冊自己,實際某處存在著對它的引用,因此,垃圾回收機制對它就“束手無策”了。

    6. Daemon線程區別一般線程之處是:主程序一旦結束,Daemon線程就會結束。

    7. 一個對象中的所有synchronized方法都共享一把鎖,這把鎖能夠防止多個方法對通用內存同時進行的寫操作。synchronized static方法可在一個類范圍內被相互間鎖定起來。

    8. 對于訪問某個關鍵共享資源的所有方法,都必須把它們設為synchronized,否則就不能正常工作。

    9. 假設已知一個方法不會造成沖突,最明智的方法是不要使用synchronized,能提高些性能。

    10 . 如果一個"同步"方法修改了一個變量,而我們的方法要用到這個變量(可能是只讀),最好將自己的這個方法也設為 synchronized。

    11. synchronized不能繼承, 父類的方法是synchronized,那么其子類重載方法中就不會繼承“同步”。

    12. 線程堵塞Blocked有幾個原因造成:

    (1)線程在等候一些IO操作
    (2)線程試圖調用另外一個對象的“同步”方法,但那個對象處于鎖定狀態,暫時無法使用。

    13. 原子型操作(atomic), 對原始型變量(primitive)的操作是原子型的atomic. 意味著這些操作是線程安全的, 但是大部分情況下,我們并不能正確使用,來看看 i = i + 1 , i是int型,屬于原始型變量:

    (1)從主內存中讀取i值到本地內存.
    (2)將值從本地內存裝載到線程工作拷貝中.
    (3)裝載變量1.
    (4)將i 加 1.
    (5)將結果給變量i.
    (6)將i保存到線程本地工作拷貝中.
    (7)寫回主內存.

    注意原子型操作只限于第1步到第2步的讀取以及第6到第7步的寫, i的值還是可能被同時執行i=i+1的多線程中斷打擾(在第4步)。

    double 和long 變量是非原子型的(non-atomic)。數組是object 非原子型。

    14. 由于13條的原因,我們解決辦法是:

    class xxx extends Thread{

    //i會被經常修改
    private int i;

    public synchronized int read(){ return i;}

    public synchronized void update(){ i = i + 1;}

    ..........

    }

    15. Volatile變量, volatile變量表示保證它必須是與主內存保持一致,它實際是"變量的同步", 也就是說對于volatile變量的操作是原子型的,如用在long 或 double變量前。

    16. 使用yield()會自動放棄CPU,有時比sleep更能提升性能。

    17. sleep()和wait()的區別是:wait()方法被調用時會解除鎖定,但是我們能使用它的地方只是在一個同步的方法或代碼塊內。

    18. 通過制造縮小同步范圍,盡可能的實現代碼塊同步,wait(毫秒數)可在指定的毫秒數可退出wait;對于wait()需要被notisfy()或notifyAll()踢醒。

    19. 構造兩個線程之間實時通信的方法分幾步:
    (1). 創建一個PipedWriter和一個PipedReader和它們之間的管道;
    PipedReader in = new PipedReader(new PipedWriter())
    (2). 在需要發送信息的線程開始之前,將外部的PipedWriter導向給其內部的Writer實例out
    (3). 在需要接受信息的線程開始之前,將外部的PipedReader導向給其內部的Reader實例in
    (4). 這樣放入out的所有東西度可從in中提取出來。

    20. synchronized帶來的問題除性能有所下降外,最大的缺點是會帶來死鎖DeadLock,只有通過謹慎設計來防止死鎖,其他毫無辦法,這也是線程難以馴服的一個原因。不要再使用stop() suspend() resume()和destory()方法

    21. 在大量線程被堵塞時,最高優先級的線程先運行。但是不表示低級別線程不會運行,運行概率小而已。

    22. 線程組的主要優點是:使用單個命令可完成對整個線程組的操作。很少需要用到線程組。

    23. 從以下幾個方面提升多線程的性能:

    檢查所有可能Block的地方,盡可能的多的使用sleep或yield()以及wait();

    盡可能延長sleep(毫秒數)的時間;

    運行的線程不用超過100個,不能太多;

    不同平臺linux或windows以及不同JVM運行性能差別很大。

    24. 推薦幾篇相關英文文章:



    大盤預測 國富論
    posted on 2007-10-22 10:21 華夢行 閱讀(234) 評論(1)  編輯  收藏 所屬分類: JDK

    評論:
    # re: 多線程設計要點 2007-11-13 17:00 | rainbow
    5、6條不是很懂,能指點下嗎?
    “通過制造縮小同步范圍,盡可能的實現代碼塊同步,wait(毫秒數)可在指定的毫秒數可退出wait;對于wait()需要被notisfy()或notifyAll()踢醒”
    應當是sleep(毫秒數)吧??
    heavenhell@163.com
    聆聽教誨!!  回復  更多評論
      
    主站蜘蛛池模板: 亚洲视频一区在线播放| 亚洲国产精品无码久久青草| 亚洲AV日韩AV天堂久久| 国产精品1024在线永久免费 | 亚洲午夜在线播放| 91九色老熟女免费资源站| 亚洲精品一卡2卡3卡三卡四卡| 久久久久成人精品免费播放动漫| 亚洲人精品午夜射精日韩| 日本卡1卡2卡三卡免费| 久久精品国产亚洲AV高清热| 最近中文字幕完整版免费高清| 亚洲欧洲自拍拍偷午夜色| 日本免费网址大全在线观看| 亚洲色偷偷综合亚洲AV伊人蜜桃| 在线观看视频免费国语| 老司机精品视频免费| 国产日韩成人亚洲丁香婷婷| 任你躁在线精品免费| 亚洲国产女人aaa毛片在线| 希望影院高清免费观看视频| 亚洲精品无码成人| MM131亚洲国产美女久久| 一级毛片不卡片免费观看| 亚洲三级在线视频| yy6080亚洲一级理论| 成人爽a毛片免费| 精品丝袜国产自在线拍亚洲| 免费国产不卡午夜福在线| 中国在线观看免费的www| 亚洲伊人久久大香线蕉影院| 国产一级理论免费版| 在线观看人成视频免费无遮挡 | 无码区日韩特区永久免费系列 | 一个人免费视频在线观看www | 亚洲成人高清在线观看| 亚洲Av无码乱码在线znlu| 久久国产乱子伦精品免费不卡| 亚洲伦理中文字幕| 国产亚洲精品成人AA片新蒲金| 中文字幕免费在线|