2013-11-23 10 views
5

Ich verstehe, dass ein synchronisierter Block oder eine Methode alle Threads blockiert, bis der eine "links" ist. Ich frage mich, kann Kontextwechsel passieren, wenn der Thread im synchronisierten Block ausgeführt wird? Nach meinem Verständnis sollte es nicht.Kann in Java die Thread-Umschaltung im synchronisierten Block stattfinden?

Danke!

+1

Ja, Kontextwechsel kann passieren, wie es von OS und nicht JVM behandelt wird –

Antwort

9

Kann Kontextwechsel passieren, wenn der Thread im synchronisierten Block ausgeführt wird?

Ja, ein Kontextwechsel kann auch innerhalb eines synchronized Blocks passieren. Die einzige Sache, die anders ist, ist, dass kein anderer Thread denselben synchronized Block (oder irgendeinen anderen Block synchronized auf demselben Objekt) eingeben könnte, bis der Kontext zurück zu diesem vorweggenommenen Thread wechselt und ihn mit seinem beenden lässt geschützter Code.

+0

Sinn machen, perfekt !! – Abidi

3

Was Sie verstehen, ist falsch. Ein synchronisierter Block blockiert andere Threads nicht. Ein synchronisierter Block verhindert nur, dass andere Threads in einen Block gelangen, der für dasselbe Objekt synchronisiert ist. Andere Threads laufen weiter, während ein synchronisierter Block ausgeführt wird.

Und natürlich kann Kontextwechsel im synchronisierten Block passieren, weil andere Threads auch etwas Zeit haben müssen, um sich selbst auszuführen. Wenn dies nicht der Fall wäre, würden zwei synchronisierte Blöcke, die für einige Sekunden ausgeführt werden, alles andere auf einem 2-Kern-Rechner blockieren. Das willst du wirklich nicht.

+0

Mein Verständnis der Blockierung von Threads außerhalb synchronisierten Block ist richtig, vielleicht war Ihr Verständnis meiner Frage falsch. Danke für deine Antwort zum Kontextwechsel, es macht Sinn. – Abidi

+0

Ich kann dein Verständnis nur durch das, was du postest, beurteilen. Und du hast gepostet * Ich verstehe, dass ein synchronisierter Block oder eine synchronisierte Methode alle Threads blockieren wird, bis der eine "links" * ist, was eindeutig nicht synchron ist. –

-2

Der Hauptgrund, dass Sie synchronisierten Block verwenden, ist die Kontextumschaltung durch das Betriebssystem tatsächlich durchgeführt! Wenn es keinen Kontextwechsel gab, war auch kein synchronisierter Block erforderlich.

Eigentlich keine Kontextwechsel bedeutet keine Thread-Unterstützung! Ja, es stimmt mit MS-DOS, aber nicht mit einem modernen Betriebssystem!

0

Think Thread wechseln und synchronisieren sind 2 verschiedene Dinge. Synchronize kümmert sich nur um die gemeinsame Nutzung von Ressourcen nicht mehr und nicht weniger. Ein anderer Thread könnte etwas komplett anderes machen. Also sind beide nicht verwandt.

1

Kontextwechsel kann innerhalb der synchronized passieren. Wie können wir sleep() oder wait() Methode in synchronized Block aufrufen. Entweder sleep() oder wait() machen aktuellen Thread nicht ausführbar.

Verwandte Themen