Java多線程知識整理

來源:互聯網
上載者:User

標籤:總結   java   thread   線程   

一、概念進程-->進行中中的程式。

迅雷下載時將一個檔案拆分為5部分,是為了跟CPU爭奪資源。
拆分的5部分,每一部分都稱之為線程。

線程是程式中的控制單元,或者叫執行路徑。
每一個進程執行都有一個執行順序,該順序是一個執行路徑,

每一個程式開啟,都會在記憶體中分配一塊空間。
進程就是為了定義,標識這個空間的,它用於封裝裡面的控制單元。

線程就是進程中的一個獨立的控制單元,線程在控制著進程的執行。

一個進程中至少有一個線程,線程是進程中的內容。
 
JVM 啟動的時候會有一個進程Java.exe
該進程中至少有一個線程負責java程式的執行,
而且這個線程啟動並執行代碼存在與main方法中。
該線程稱之為主線程。

擴充:
其實更細節說明虛擬機器jvm,jvm啟動不止一個線程,還有負責記憶體回收機制的線程。

多線程的意義:
為了使代碼同時運行,便於執行提高效率。


二、Thread類:用於描述控制單元(線程)這類事物的類。該類定義了一個功能,用於儲存線程要啟動並執行代碼,該儲存功能就是run方法。
也就是說Tread類中的run方法,用於儲存線程要啟動並執行代碼。

進程、線程都是由系統幫我們建立的,java已經提供好了對這種操作的描述和體現。


建立新執行線程的兩種方法:
1、將類聲明為Tread的子類,該子類應重寫run方法。
為什麼要重寫run方法呢?
目的:將自訂的代碼儲存在run方法中,讓線程運行。
2、實現Runnable介面,覆寫run方法。
將Runnable介面的子類對象作為參數傳遞給Thread的建構函式。

實現方式和繼承方式有什麼區別?
繼承Thread:線程代碼存放在Thread子類run方法中。
實現Runnable:線程代碼存在介面的子類run方法中。
實現方式的好處:避免了單繼承的局限性。
在定義線程時,建立使用實現方式。

注意:如果僅僅調用run方法不能實現多線程。因為線程沒有被開啟。
start方法有兩個作用:開啟線程並執行該線程的run方法。

瞭解:
早期的一些病毒就是開啟n多線程“搶劫”CPU資源造成死機。

多線程看似實現了程式的同時執行,其實是CPU在做著快速的切換。
多線程的特性:隨機性。

瞭解:
多核可以實現同時執行,前提是記憶體得夠大。


線程的四種狀態:
start() sleep(time)
被建立--------->運行----------------->凍結:放棄了執行資格 
| wait()
| stop()or run方法結束
└------>消亡
第五種狀態:
臨時狀態
阻塞:具備運行資格,但沒有執行權

sleep:到時間會自動運行
wait:需要別人喚醒——notify方法


線程的方法:
|---getName():返回線程的名稱Tread-0,從0開始
|---setName():設定線程的名稱。
|---在構造中可以直接設定名稱。
|---currentThread:static返回當前正在執行的線程對象


多線程存在的問題:
寫多線程一定要小心安全問題。

當多條語句在操作同一個線程共用資料時,一個線程對多條語句只
執行了一部分,還沒有執行完,另一個線程參與進來執行,導致共
享資料的錯誤。

解決辦法:
對多條操作共用資料的語句,只能讓一個線程都執行完。
在執行過程中,其他線程不可以參與執行。——同步代碼塊。

synchronized(對象){
需要被同步的代碼
}


對象如同鎖,持有鎖的線程可以在同步中執行。
沒有鎖的線程即使擷取cpu的執行權,也進不去,因為沒有擷取鎖。

同步的前提:
1、必須要有兩個或以上的線程。
2、必須是多個線程使用同一個鎖。

好處:解決了多線程的安全問題,
弊端:多個線程需要判斷鎖,較為消耗資源。


如何找問題:
1、明確哪些代碼是多線程運行代碼。
2、明確共用資料。
3、明確多線程運行代碼中哪些語句是操作共用資料的。

同步函數
public synchronized void add(int i)
函數需要被對象調用,以上用同步函數的話沒有傳入對象,預設的就是this

注意:如果同步函數被靜態修時候,使用的鎖是什麼呢?
反正不是this,因為靜態方法中也不可以定義this。
靜態進記憶體中,沒有本類對象,但是一定有該類對應的位元組嗎檔案對象。
類名.class 該對象的類型是class。

單例設計模式懶漢式的安全問題:

解決方案:

class Single{private static Single s=null;private Single(){}public static Single getInstance(){if(s==null){synchronized(Single.class){if(s==null){s=new Single();}}}}}


面試考點:懶漢式的特點在於,消極式載入。
使用多線程時會出現安全隱患,可以用同步解決,但較為低效,
可以用多重判斷解決這個低效問題,鎖用的是該類所屬的位元組碼檔案對象。

死結:
同步中嵌套同步,但鎖不同。

死結程式:

package Demos;public class Demo_06 {public static void main(String[] args) {new DeadLock(false).start();new DeadLock(true).start();}}class DeadLock extends Thread{private boolean flag=false;DeadLock(boolean flag){this.flag=flag;}@Overridepublic void run() {if(flag){synchronized(Lock.lockA){System.out.println("if lockA");synchronized(Lock.lockB){System.out.println("if lockB");}}}else{synchronized(Lock.lockB){System.out.println("else lockA");synchronized(Lock.lockA){System.out.println("else lockB");}}}}}class Lock{static Object lockA=new Object();static Object lockB=new Object();}














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.