JAVA多線程和並發性知識點總結,java多線程

來源:互聯網
上載者:User

JAVA多線程和並發性知識點總結,java多線程

上次我總結了一份JAVA 物件導向和集合知識點總結:
http://blog.csdn.net/zhoubin1992/article/details/46481759
這次對JAVA多線程和並發性相關知識點進行總結,方便各位博友學習以及自己複習之用。

一、 什麼是進程、線程?線程和進程的區別?

1. 進程
當一個程式進入記憶體運行時,即變成一個進程。進程是處於運行過程中的程式。
進程是作業系統進行資源分派和調度的一個獨立單位。
進程的三個特徵:

  • 獨立性
    獨立存在的實體,每個進程都有自己獨立私人的一塊記憶體空間。
  • 動態性
    程式只是一個靜態指令集合,而進程是一個正在系統中活動的指令集合。
  • 並發性
    多個進程可在單一處理器上並發執行。
並發性和並行性    並發是指在同一時間點只能有一條指令執行,但多個進程指令被快速輪換執行,使得在宏觀上具有多個進程同時執行的效果。    並行指在同一時間點,有多條指令在多個處理器上同時執行。

2. 線程
線程是作業系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。線程也被稱作輕量級進程。線程在進程中是獨立,並發的執行流。
3.線程和進程的區別

二、 多線程的優勢 三、 Java中建立線程方法

1. 繼承Thread類建立線程類

四、 用Runnable還是ThreadJava以及建立線程兩種方法對比?

在java多線程中,一般推薦採用實現Runnable介面來建立多線程,因為實現Runnable介面相比繼承Thread類有如下優劣勢:

  • 實現Runnable介面,線程類只是實現了介面,還可以繼承其他類;繼承Thread類的話,不能再繼承其他父類。
  • 實現Runnable介面,多個線程可以共用同一個target對象,所以適合多個相同程式碼的線程區處理同一資源的情況。分離資料和代碼,體現物件導向的思想。
  • 實現Runnable介面,訪問當前線程,必須使用Thread.currentThread()方法;繼承Thread類的話,使用this獲得當前線程。
    與http://blog.csdn.net/ns_code/article/details/17161237互補。
五、 Thread 類中的start() 和 run() 方法有什麼區別? 六、 線程的生命週期

Java線程五種狀態:

  • 死亡狀態(Dead):線程run()方法執行完了或者因異常退出了run()方法,該線程結束生命週期。
    當主線程結束時,其他線程不受任何影響。
  • 七、 java控制線程方法

    1. join線程
    join方法用線程對象調用,如果在一個線程A中調用另一個線程B的join方法,線程A將會等待線程B執行完畢後再執行。
    2. 守護線程(Daemon Thread)
    Java中有兩類線程:User Thread(使用者線程)、Daemon Thread(守護線程) 。
    使用者線程即運行在前台的線程,而守護線程是運行在背景線程。 守護線程作用是為其他前台線程的運行提供便利服務,而且僅在普通、非守護線程仍然運行時才需要,比如記憶體回收線程就是一個守護線程。當VM檢測僅剩一個守護線程,而使用者線程都已經退出運行時,VM就會退出,因為沒有如果沒有了被守護這,也就沒有繼續運行程式的必要了。如果有非守護線程仍然存活,VM就不會退出。
    守護線程的特徵:如果所有前台線程都死亡,後台線程會自動死亡。
    守護線程並非只有虛擬機器內部提供,使用者在編寫程式時也可以自己設定守護線程。使用者可以用Thread的setDaemon(true)方法設定當前線程為守護線程。
    雖然守護線程可能非常有用,但必須小心確保其他所有非守護線程消亡時,不會由於它的終止而產生任何危害。因為你不可能知道在所有的使用者線程退出運行前,守護線程是否已經完成了預期的服務任務。一旦所有的使用者線程退出了,虛擬機器也就退出運行了。 因此,不要在守護線程中執行商務邏輯操作(比如對資料的讀寫等)。
    另外有幾點需要注意:

    1、setDaemon(true)必須在調用線程的start()方法之前設定,否則會跑出IllegalThreadStateException異常。2、在守護線程中產生的新線程也是守護線程。  3、 不要認為所有的應用都可以分配給守護線程來進行服務,比如讀寫操作或者計算邏輯。 

    參考http://blog.csdn.net/ns_code/article/details/17099981
    3. 線程讓步(yield )
    yield可以直接用Thread類調用,可以讓當前正在執行的線程暫停,不會阻塞該線程,只是將該線程轉入就緒狀態。yield讓出CPU執行權給同等級的線程,如果沒有相同層級的線程在等待CPU的執行權,則該線程繼續執行。

    八、 sleep()方法和yield()方法的區別 九、 為什麼Thread類的sleep()和yield()方法是靜態?

    Thread類的sleep()和yield()方法將在當前正在執行的線程上運行。所以在其他處於等待狀態的線程上調用這些方法是沒有意義的。它們可以在當前正在執行的線程中工作,並避免程式員錯誤的認為可以在其他非運行線程調用這些方法。
    現在的實現, 是只能sleep當前的線程.當前線程是自願的.讓sleep()成為執行個體方法, 當前線程可以直接sleep別的線程, 會引入很多 多線程問題,例如死結。
    destroy(), suspend(), stop(),resume()這些執行個體方法都已經被deprecated(棄用)。活下來的是哪些? 只有static方法(只對當前線程操作和一些比較溫和的執行個體方法, 如getXXX(), isXXX(), join(), yield()等.

    十、 sleep方法與wait方法的區別? 十一、 安全執行緒問題

    安全執行緒問題,其實是指多線程環境下對共用資源的訪問可能會引起此共用資源的不一致性。因此,為避免安全執行緒問題,應該避免多線程環境下對此共用資源的並發訪問。

    十二、 同步代碼塊

    同步代碼塊的格式為:

     synchronized (obj) {                 //... }

    其中,obj為鎖對象,因此,選擇哪一個對象作為鎖是至關重要的。一般情況下,都是選擇此共用資源對象作為鎖對象。
    任何時刻只能有一個線程可以獲得對鎖對象的鎖定,其他線程無法獲得鎖,也無法修改它。當同步代碼塊執行完成後,該線程會釋放對鎖對象的鎖定。
    通過這種方式可以保證並發線程在任一時刻只有一個線程可以進入修改共用資源的代碼區(臨界區),從而保證線程的安全性。

    十三、 同步方法

    對共用資源進行訪問的方法定義中加上synchronized關鍵字修飾,使得此方法稱為同步方法。可以簡單理解成對此方法進行了加鎖,其鎖對象為當前方法所在的對象自身。多線程環境下,當執行此方法時,首先都要獲得此同步鎖(且同時最多隻有一個線程能夠獲得),只有當線程執行完此同步方法後,才會釋放鎖對象,其他的線程才有可能擷取此同步鎖,以此類推…

     public synchronized void a() {             // .... }

    可變類的安全執行緒是以降低程式的運行效率為代價的,為了減少程式安全所帶來的負面影響,程式可以採用如下策略:
    - 不要對安全執行緒類的所有方法都進行同步,只對那些會改變競爭資源的方法進行同步。
    - 如果可變類有兩種運行環境:單線程和多線程環境,則應該為該可變類提供兩種版本:線程不安全版本和安全執行緒版本。在單線程環境中使用線程不安全版本以保證效能,在多線程環境中使用安全執行緒版本。

    十四、 何時會釋放對同步監視器鎖定?

    程式無法顯式的釋放對同步監視器的鎖定,線程可以通過以下方式釋放鎖定:
    A、當線程的同步方法、同步程式碼程式庫執行結束,就可以釋放同步監視器
    B、當線程在同步程式碼程式庫、方法中遇到break、return終止代碼的運行,也可釋放
    C、當線程在同步程式碼程式庫、同步方法中遇到未處理的Error、Exception,導致該代碼結束也可釋放同步監視器
    D、當線程在同步程式碼程式庫、同步方法中,程式執行了同步監視器對象的wait方法,導致方法暫停,釋放同步監視器

    下面情況不會釋放同步監視器:A、當線程在執行同步程式碼程式庫、同步方法時,程式調用了Thread.sleep()/Thread.yield()方法來暫停當前程式,當前程式不會釋放同步監視器B、當線程在執行同步程式碼程式庫、同步方法時,其他線程調用了該線程的suspend方法將該線程掛起,該線程不會釋放同步監視器。注意盡量避免使用suspend、resume
    十五、同步鎖(Lock)

    通常認為:Lock提供了比synchronized方法和synchronized代碼塊更廣泛的鎖定操作,Lock更靈活的結構,有很大的差別,並且可以支援多個Condition對象
    Lock是控制多個線程對共用資源進行訪問的工具。通常,鎖提供了對共用資源的獨佔訪問,每次只能有一個線程對Lock對象加鎖,
    線程開始訪問共用資源之前應先獲得Lock對象。不過某些鎖支援共用資源的並發訪問,如:ReadWriteLock(讀寫鎖),線上程安全控制中,
    通常使用ReentrantLock(可重新進入鎖)。使用該Lock對象可以顯示加鎖、釋放鎖。

        class C {        //鎖對象        private final ReentrantLock lock = new ReentrantLock();        ......        //保證安全執行緒方法        public void method() {            //上鎖            lock.lock();            try {                //保證安全執行緒作業碼            } catch() {            } finally {                lock.unlock();//釋放鎖            }        }    }

    使用Lock對象進行同步時,鎖定和釋放鎖時注意把釋放鎖放在finally中保證一定能夠執行。使用鎖和使用同步很類似,只是使用Lock時顯示的調用lock方法來同步。而使用同步方法synchronized時系統會隱式使用當前對象作為同步監視器,同樣都是“加鎖->訪問->釋放鎖”的操作模式,都可以保證只能有一個線程操作資源。
    同步方法和同步代碼塊使用與競爭資源相關的、隱式的同步監視器,並且強制要求加鎖和釋放鎖要出現在一個塊結構中,而且獲得多個鎖時,它們必須以相反的順序釋放,且必須在與所有鎖被擷取時相同的範圍內釋放所有資源。
    Lock提供了同步方法和同步程式碼程式庫沒有的其他功能,包括用於非塊結構的tryLock方法,已經試圖擷取可中斷鎖lockInterruptibly()方法, 還有擷取逾時失效鎖的tryLock(long, timeUnit)方法。
    ReentrantLock具有重入性,也就是說線程可以對它已經加鎖的ReentrantLock再次加鎖,ReentrantLock對象會維持一個計數器來追蹤lock方法的嵌套調用,線程在每次調用lock()加鎖後,必須顯示的調用unlock()來釋放鎖,所以一段被保護的代碼可以調用另一個被相同鎖保護的方法。

    十六、死結

    當2個線程相互等待對方是否同步監視器時就會發生死結,JVM沒有採取處理死結的措施,這需要我們自己處理或避免死結。
    一旦死結,整個程式既不會出現異常,也不會出現錯誤和提示,只是線程將處於阻塞狀態,無法繼續。
    由於Thread類的suspend也很容易導致死結,所以Java不推薦使用此方法暫停線程。
    參考http://ifeve.com/deadlock/瞭解更多死結情況。
    大部分代碼並不容易產生死結,死結可能在代碼中隱藏相當長的時間,等待不常見的條件地發生,但即使是很小的機率,一旦發生,便可能造成毀滅性的破壞。避免死結是一件困難的事,遵循以下原則有助於規避死結

     1、只在必要的最短時間內持有鎖,考慮使用同步語句塊代替整個同步方法; 2、盡量編寫不在同一時刻需要持有多個鎖的代碼,如果不可避免,則確保線程持有第二個鎖的時間盡量短暫; 3、建立和使用一個大鎖來代替若干小鎖,並把這個鎖用於互斥,而不是用作單個對象的對象層級鎖;

    參考:http://blog.csdn.net/ns_code/article/details/17200937

    這些我都是看書,以及參考網路資料總結的。接下來還會總結線程通訊,線程池和安全執行緒集合類相關知識點。我會在本博文更新~

    參考:
    http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/
    http://ifeve.com/java-concurrency-thread-directory/
    http://www.importnew.com/12773.html
    http://www.cnblogs.com/lwbqqyumidi/p/3804883.html
    java編程思想
    java瘋狂講義

    著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.