dingfirst

          On the Road

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            8 隨筆 :: 2 文章 :: 3 評論 :: 0 Trackbacks

          1 .多線程中有主內(nèi)存和工作內(nèi)存之分, 在JVM中,有一個主內(nèi)存,專門負(fù)責(zé)所有線程共享數(shù)據(jù);而每個線程都有他自己私有的工作內(nèi)存, 主內(nèi)存和工作內(nèi)存分貝在JVM的stack區(qū)和heap區(qū)。

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

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

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

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

          6. Daemon線程區(qū)別一般線程之處是:主程序一旦結(jié)束,Daemon線程就會結(jié)束。

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

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

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

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

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

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

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

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

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

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

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

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

          class xxx extends Thread{

          //i會被經(jīng)常修改
          private int i;

          public synchronized int read(){ return i;}

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

          ..........

          }

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

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

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

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

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

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

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

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

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

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

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

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

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

          24. 推薦幾篇相關(guān)英文文章:

          Use Threading Tricks to Improve Programs



          原文:多線程設(shè)計要點? 板橋里人 http://www.jdon.com/concurrent/thread.htm

          posted on 2006-07-14 13:06 dingfirst 閱讀(376) 評論(2)  編輯  收藏

          評論

          # re: 多線程設(shè)計要點(轉(zhuǎn)載) 2006-07-18 08:59 永遠(yuǎn)的helloworld
          覺得既然對int型變量的讀取是原子操作,那么
          public synchronized int read(){ return i;}
          這個讀方法沒有必要同步。

          如果有其他地方用到讀取、修改、然后再寫入,那么對i的同步的職責(zé)也不應(yīng)該是這個方法的。  回復(fù)  更多評論
            

          # re: 多線程設(shè)計要點(轉(zhuǎn)載) 2006-07-18 19:20 dingfirst
          應(yīng)該是不用同步  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阜新| 伊金霍洛旗| 舞钢市| 长泰县| 察雅县| 涟水县| 射阳县| 乌兰浩特市| 全州县| 霍邱县| 读书| 大埔区| 卓尼县| 思南县| 天长市| 航空| 莱芜市| 隆尧县| 平凉市| 慈溪市| 疏附县| 湖州市| 康定县| 临汾市| 临邑县| 溆浦县| 噶尔县| 阿图什市| 漳浦县| 德州市| 公安县| 丹江口市| 泸定县| 铜梁县| 镇安县| 冕宁县| 炎陵县| 泾源县| 淳化县| 长沙县| 齐齐哈尔市|