2014-02-19 34 views
1

我在同一類即 Thread A obj, Thread B obj, Thread C obj有三個threads和類包含3 static synchronized methods所以當我們start 3個線程say a.meth1,b.meth2,c.meth3 什麼會發生 - 做所有三會執行或只有一個`的java:正在運行的線程方法在同一類

更新: interviewr問我這個問題所以實際上我確實有任何代碼來在這裏寫

+2

如果您發佈了一些相關的代碼,問題會變得更加清晰。 –

+0

@ExtremeCoders我的面試官口頭問我這個問題。 –

回答

5

這些方法是靜態的和同步的。所以,鎖將在類對象上。不在類的實例上..所以這些方法會一個接一個地運行.... Thread2和Thread3將會有等待,直到thread1完成method1().. syncronization不是在方法級別..它總是在對象級... beit實例對象或類對象。

+1

爲什麼這麼多'..'? –

+1

謝謝你,我還說要採訪這個相同的東西 –

+2

@SotiriosDelimanolis - 一個壞習慣......哪個BTW我打算結束...... :) – TheLostMind

2

那麼他們將通過一個串行執行它嗎?因爲這些方法是靜態同步的。所以鎖定將保持在Class Level而不是方法級別。因此,一個線程將獲得鎖定,而其他線程將不得不等待。

你應該嘗試運行這個並看看。

+1

這些方法是靜態的和同步的。 –

+0

它們是靜態的和同步的。所以,鎖將在類對象上。不在類的實例上..所以這些方法會一個接一個地運行...... Thread2和Thread3必須等到thread1完成method1().. syncronization不在方法級別..它始終在對象級別... beit實例對象或類對象... – TheLostMind

+0

@SotiriosDelimanolis我監督'靜態'..我的錯誤。更新了答案。謝謝指出。 – Sanjeev

1

一旦您調用同步方法,虛擬機將自動爲您調用方法的對象請求一個訪問授權。如果這是給定的,它將進入同步方法。退出直到將釋放此訪問權限。在保留權限的同時,不允許任何人進入同一對象的任何同步方法,從而有效地序列化請求。

確實有道理嗎?

同步的目的是讓事情變得線程安全並避免競爭條件,並且這種方式最多可以減少對最多一個線程的訪問。程序無法確定兩個同步方法AB是否以其他方式連接,因此它具有最小容差的策略。

如果您需要更多的同步,例如該AB需求是相互排斥的,CD需求是相互排斥的,但不是之間,說AC然後建議通常對modularise代碼,以便A+B進入一個對象,而C+D進入另一個,從而避免以跨越彼此的腳趾

+0

對不起,沒有看到對靜態方法的引用,也跟其他人都說的類一樣 –

1

如果執行同一類的對象試圖從不同線程進入同一同步方法(不管是否爲靜態),它們將被同步(即一次執行一個)。

0

static synchronized methodsnon static synchronized methods之間的主要區別是,non-static synchronized methods保持在類而static synchronized methodsclass對象上的instance的鎖。

由於在java中每個類都有一個類對象,所以在同一個中只有一個線程可以在靜態同步方法內部執行。

對於非靜態同步方法只有一個線程可以在同一對象

還有一點靜態同步方法內執行是同步是在對象級別不是作爲方法的水平。

相關問題