JAVA筆記 之 Thread線程

 

線程是一個程序的多個執行路徑,執行調度的單位,依託於進程存在。 線程不只能夠共享進程的內存,並且還擁有一個屬於本身的內存空間,這段內存空間也叫作線程棧,是在創建線程時由系統分配的,主要用來保存線程內部所使用的數據,如線程執行函數中所定義的變量。
注意:Java中的多線程是一種搶佔機制而不是分時機制。搶佔機制指的是有多個線程處於可運行狀態,可是隻容許一個線程在運行,他們經過競爭的方式搶佔CPU。java

1、定義一個線程有兩種方法:
一、繼承java.lang.Thread類,重寫run()方法,經過線程的start()方法被JVM自動運行。
public class ThreadTest extend Thread {程序員

@Override
public void run() {
System.out.println("I'm running!");
};多線程

}併發

二、實現Runnable接口,實現run方法,做爲線程Thread類的參數並經過start()方法調用。
public class ThreadTest implements Runnable {ide

public void run() {
System.out.println("I'm running!");
};函數

}性能

2、線程的狀態
一、新生狀態(New):當一個線程的實例被建立即便用new關鍵字和Thread類或其子類建立一個線程對象後,此時該線程處於新生(new)狀態,處於新生狀態的線程有本身的內存空間,但該線程並無運行,此時線程還不是活着的(not alive);
二、就緒狀態(Runnable):經過調用線程實例的start()方法來啓動線程使線程進入就緒狀態(runnable);處於就緒狀態的線程已經具有了運行條件,但尚未被分配到CPU即不必定會被當即執行,此時處於線程就緒隊列; 此時線程是活着的(alive);
三、運行狀態(Running):一旦獲取CPU(被JVM選中),線程就進入運行(running)狀態,線程的run()方法纔開始被執行;在運行狀態的線程執行本身的run()方法中的操做,直到調用其餘的方法而終止、或者等待某種資源而阻塞、或者完成任務而死亡;若是在給定的時間片內沒有執行結束,就會被系統給換下來回到線程的等待狀態;此時線程是活着的(alive);
四、阻塞狀態(Blocked):經過調用join()、sleep()、wait()或者資源被暫用使線程處於阻塞(blocked)狀態;處於Blocking狀態的線程仍然是活着的(alive)
五、死亡狀態(Dead): 執行run()方法完畢或者異常退出後的狀態。對於一個處於Dead狀態的線程調用start()方法,會出現一個運行期(runtime exception)的異常;處於Dead狀態的線程不是活着的(not alive)。優化

3、線程的經常使用屬性
一、優先級(priority)
二、thread.sleep()/sleep(long millis)
三、Thread.yield()
四、thread.join()
五、object.wait()
六、object.notify()/notifyAll()
七、synchronized blockspa

4、Thread synchronized
一、非static的synchronized方法
被鎖定的是類的對象,在多線程中,這個對象不能被多個線程同時訪問,可是所屬類的其餘對象的此方法不受限制;
若是一個對象有多個非static的同步方法,一旦進入其中一個,就鎖定此對象,沒法進入其餘同步方法
二、static的synchronized方法
因爲static的成員不屬於類對象,而是屬於Class,所以,這裏鎖定的是Class類,而不是對象,因此若是static和非static的同步方法共存,
沒有衝突。可是若是兩個static同步方法,不管是不是不一樣對象,都是互斥的,由於他們都屬於同一個Class類。
三、synchronized同步塊
synchronized塊則是一種細粒度的併發控制,只會將塊中的代碼同步,位於方法內、synchronized塊以外的其餘代碼是能夠被多個線程同時訪問到的。
注意:被synchronized保護的數據應該是私有的。線程

5、Lock鎖
Lock的鎖定是經過代碼實現的,而 synchronized 是在 JVM 層面上實現的。
synchronized在鎖定時若是方法塊拋出異常,JVM 會自動將鎖釋放掉,不會由於出了異常沒有釋放鎖形成線程死鎖。可是 Lock 的話就享受不到 JVM 帶來自動的功能,出現異常時必須在 finally 將鎖釋放掉,不然將會引發死鎖。
在資源競爭不是很激烈的狀況下,偶爾會有同步的情形下,synchronized是很合適的。緣由在於,編譯程序一般會盡量的進行優化synchronize,另外可讀性很是好,無論用沒用過5.0多線程包的程序員都能理解。

ReentrantLockReentrantLock提供了多樣化的同步,好比有時間限制的同步,能夠被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在資源競爭不激烈的情形下,性能稍微比synchronized差點點。可是當同步很是激烈的時候,synchronized的性能一會兒能降低好幾十倍。而ReentrantLock確還能維持常態。 Atomic和上面的相似,不激烈狀況下,性能比synchronized略遜,而激烈的時候,也能維持常態。激烈的時候,Atomic的性能會優於ReentrantLock一倍左右。可是其有一個缺點,就是隻能同步一個值,一段代碼中只能出現一個Atomic的變量,多於一個同步無效。由於他不能在多個Atomic之間同步。

相關文章
相關標籤/搜索