java多線程知識點匯總(一)多線程基礎


1.什么叫多線程程序?

答:一個進程至少有一個線程在運行,當一個進程中出現多個線程時,就稱這個應用程序是多線程應用程序。

java編寫的程序都是多線程的,因為最少有倆線程,main主線程和gc線程。

每個線程在棧區中都有自己的執行空間,自己的方法區、自己的變量。

線程為cpu增加了一條執行路徑。

2.線程隨機性執行?

答:隨機性的原理:因為cpu的快速切換造成,哪個線程獲取到了cpu的執行權,哪個線程就執行。

 3.返回當前線程的名稱:Thread.currentThread().getName()

線程的名稱是由:Thread-編號定義的。編號從0開始。

4.線程的執行方法?

答:線程要運行必須要通過類中指定的方法開啟。start方法。(啟動后,就多了一條執行路徑)

start方法:1)、啟動了線程;2)、讓jvm調用了run方法。

5.java實現多線程兩種方法?

答:繼承Thread,或實現Runable接口。 實現Runnable接口可以避免單繼承的局限性。

6.多線程產生安全問題的原因?

答:多線程對同一共享資源訪問時,才會產生線程安全問題。是同一個資源,如果每個線程都有自己new的對象執行,當然就不會存在線程安全問題。

共享資源,也就是只有一個資源,多個線程競爭訪問這個對象,就會產生線程安全問題。常見的就是單例模式,單例模式因為只有一個對象,所以就有線程安全問題。

7.多線程如果不控制線程安全會產生什么問題?

答:躲個線程共同訪問一個對象,線程A還沒執行完畢,線程B就執行了,會造成數據混亂。

常見問題就是,對一個對象的讀寫操作。A線程正在寫,B線程正在讀,可能就會讀到A還沒徹底執行完畢后的中間值。造成數據混亂。

8.怎樣解決線程安全問題---核心思想?

答:將操作共享數據的語句在某一時段讓只一個線程執行完是執行完,執行過程中其他線程不能執行,且只讓一個線程執行。就保證了執行過程中其他線程不能訪問這個共享對象。

在執行過程中,其他線程不能進來執行就可以解決這個問題。

9.java解決線程安全的手段?

答: 1)同步代碼塊。

synchronized(對象) {  // 任意對象都可以。這個對象就是鎖。

 需要被同步的代碼; 

}

同步:★★★★★//就是在操作共享數據代碼時,訪問時只能讓一個線程進去訪問,此線程執行完退出后,別的線程才能再對此共享數據代碼進行訪問。

好處:解決了線程安全問題。Synchronized

弊端:相對降低性能,因為判斷鎖需要消耗資源,產生了死鎖。

2)同步函數:其實就是將同步關鍵字定義在函數上,讓函數具備了同步性。

同步函數是用的哪個鎖呢?//synchronized(this)

通過驗證,函數都有自己所屬的對象this,所以同步函數所使用的鎖就是this鎖。 

當同步函數被static修飾時,這時的同步用的是哪個鎖呢?

靜態函數在加載時所屬於類,這時有可能還沒有該類產生的對象,但是該類的字節碼文件加載進內存就已經被封裝成了對象,這個對象就是該類的字節碼文件對象

所以靜態加載時,只有一個對象存在,那么靜態同步函數就使用的這個對象。

這個對象就是 類名.class

 

10.同步代碼塊和同步函數的區別?

同步代碼塊使用的鎖可以是任意對象。

同步函數使用的鎖是this,靜態同步函數的鎖是該類的字節碼文件對象

 11.什么時候選擇同步函數,什么時候選擇同步代碼塊?

答:在一個類中只有一個同步的話,可以使用同步函數。如果有多同步,必須使用同步代碼塊,來確定不同的鎖。所以同步代碼塊相對靈活一些。

★考點問題:請寫一個延遲加載的單例模式?寫懶漢式;當出現多線程訪問時怎么解決?加同步,解決安全問題;效率高嗎?不高;怎樣解決?通過雙重判斷的形式解決。

//懶漢式:延遲加載方式。

當多線程訪問懶漢式時,因為懶漢式的方法內對共性數據進行多條語句的操作。所以容易出現線程安全問題。為了解決,加入同步機制,解決安全問題。但是卻帶來了效率降低。

為了效率問題,通過雙重判斷的形式解決。

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();

}

}

return s;

}

}

---------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM