JAVA-線程篇

線程和進程的區別?

1、進程式系統進行資源分配的基本單位,有獨立的內存地址空間;線程是CPU調度的基本單位,沒有單獨的地址空間,有獨立的棧,局部變量,寄存器,程序計數器等。

2、創建進程的開銷大,包括創建虛擬地址空間等需要大量系統資源;創建線程開銷小,基本上只有一個內核對象和一個堆棧

3、一個進程無法直接訪問另一個進程的資源,同一個進程內的多個線程共享進程的資源

4、進程切換開銷大,線程切換開銷小,進程間通信開銷大,線程間通信開銷小

5、線程屬於進程,不能獨立執行,每個進程至少有一個線程稱爲主線程

線程生命週期的六種狀態?

1、NEW(初始化狀態):表示線程新建出來還沒有被啓動的狀態

2、Runnable(可運行狀態):表示線程正在運行,也可能是線程在就緒隊列裏等待運行

3、Blocked(阻塞狀態):線程在等待獲得鎖

4、Waiting(無時間限制的等待狀態):線程在等待某種資源就緒,對於生產者消費者模式,消費者準備獲取某個數據,但是生產者還沒有準備好,這時線程就處於等待狀態。wait()方法可以使線程處於等待狀態,notify()可以接觸這種等待。Thread.join也可以使線程處於等待。

5、Timed_Waiting(有時間限制的等待狀態):和等待相似,但是它調用的是帶有超時時間的方法

6、Terminated(終止狀態):線程正常退出或異常退出後,就處於死亡狀態

sleep和wait的區別?

1、sleep是Thread中的方法,wait是Object中的方法

2、sleep不釋放鎖,wait釋放鎖

3、sleep在任何地方中都能使用,wait在同步方法或同步代碼塊中使用

4、wait不需要捕獲異常,sleep需要捕獲異常

線程創建的方式:

1、繼承Thread類

2、實現Runnable接口

3、實現Callable接口

4、線程池

使用 start方法啓動線程的時候,JVM虛擬機會在內存中給線程分配一個獨立的內存空間,有自己的局部變量等

run方法啓動線程的時候,就是使用主線程運行,會按照順序進行調度方法,不會出現搶佔資源

實現Runnable接口比繼承Thread類所具有的優勢?

1、適合多個相同的代碼去處理同一個資源

2、避免java中單繼承帶來的限制

3、增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立

線程安全問題

synchronized關鍵字具體的使用

如圖,synchronized可以用在方法上也可以用在代碼塊種,其中方法是實例方法和靜態方法,鎖分別是該類的實例對象和該類。而在使用代碼塊也可以分爲三種。如果鎖是類對象的話,儘管new多個實例對象,但他們仍然屬於同一個類依然會被鎖住,即線程之間保證同步關係

java線程阻塞的代價:

j如果線程狀態切換是一個高頻操作時,將會消耗很多CPU處理的時間;如果對於需要同步簡單的代碼塊,獲取鎖掛起操作消耗的時間比用戶代碼執行的時間還要長,這種同步策略顯然不好。synchronized會導致爭不到的線程進入阻塞狀態,是一個重量級的鎖,jdk1.5開始引入了輕量鎖和偏向鎖,默認啓用自旋鎖,都屬於樂觀鎖

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章