2013-11-23 59 views
5

我明白一個同步塊或方法將阻止所有線程,直到裏面的一個「離開」。我想知道,當線程在同步塊內執行時,上下文切換是否會發生?根據我的理解,它不應該。在Java中,線程切換是否發生在同步塊中?

謝謝!

+1

是的,可能發生的上下文切換,因爲它是由OS而不是JVM –

回答

9

罐上下文切換髮生?

是的,上下文切換也可以在​​塊內發生。這將是唯一不同的是,沒有其他線程將必須等到上下文切換回該捷足先登線程進入同一​​塊(或同一對象上任何其他塊​​),讓它與完成其受保護代碼。

+0

有道理,完美! – Abidi

3

你明白是錯的。同步塊不會阻塞其他線程。同步塊僅阻止其他線程進入在同一對象上同步的塊。其他線程在正在執行同步塊的同時繼續運行。

和當然,上下文切換可能發生,而在synchronized塊,因爲其他線程也必須有一定的時間來執行自己。如果情況並非如此,則運行幾秒鐘的兩個同步塊將阻塞2核機器上的其他所有內容。你真的不希望發生這種情況。當線程正在執行內同步塊

+0

我的理解線程阻塞的處理外synchronized塊是正確的,也許你的問題,我的理解是不正確的。感謝您關於上下文切換的答案,這是有道理的。 – Abidi

+0

我只能通過你發佈的內容來判斷你的理解。你發佈*我理解一個同步塊或方法將阻止所有線程,直到其中一個「左」*,這顯然不是什麼同步。 –

-2

您使用synchronized塊主要的原因是,上下文切換的OS進行實際!如果沒有上下文切換,則不需要同步塊。

實際上沒有上下文切換意味着沒有線程支持!是的,關於MS-DOS是真的,但沒有任何現代操作系統!

0

想到線程切換和同步是2完全不同的東西。同步只是關心共享資源,不能更少。另一個線程可以完成不同的事情。所以兩者都沒有關係。

1

上下文切換可以在裏面​​發生。如我們可以在​​區塊中調用sleep()wait()方法。 sleep()wait()使當前線程無法運行。