Was wird passieren, wenn die Schlösser selbst bekämpft werden?

8

Alle Objekte in Java haben intrinsische Sperren und diese Sperren werden für die Synchronisation verwendet. Dieses Konzept verhindert, dass Objekte gleichzeitig von verschiedenen Threads manipuliert werden, oder hilft bei der Ausführung bestimmter Code-Blöcke.

Was passiert, wenn die Sperren selbst bekämpft werden - d. h. zwei Threads, die genau die Mikrosekunde nach der Sperre fragen.

Wer bekommt es und wie wird es gelöst?

    
Question Everything 30.12.2013, 04:41
quelle

4 Antworten

3
  

Was passiert, wenn die Sperren selbst bekämpft werden - d. h. zwei Threads, die genau die Mikrosekunde nach der Sperre fragen.

Ein Thread erhält die Sperre, und die andere wird blockiert, bis der erste Thread sie freigibt.

(Nebenbei: einige der anderen Antworten behaupten, dass es in Java keine "zur gleichen Zeit" gibt. Sie sind falsch !! Es gibt so etwas! Wenn die JVM zwei oder mehr verwendet Kerne eines Multi-Core-Systems, dann zwei Threads auf verschiedenen Kernen könnte die gleiche Objektsperre in genau im selben Hardware-Takt anfordern. Klar, nur einer wird es bekommen, aber das ist ein anderes Thema.)

  

Wer bekommt es und wie wird es gelöst?

Es ist nicht angegeben, welcher Thread die Sperre erhalten wird.

Es wird (normalerweise) vom OS'es-Thread-Scheduler ... gelöst, wobei alle Mechanismen verwendet werden, die verwendet werden. Dieser Aspekt des JVM-Verhaltens ist (offensichtlich) plattformspezifisch.

Wenn Sie wirklich genau herausfinden wollen, was vor sich geht, ist der Quellcode für OpenJDK und Linux frei verfügbar. Aber um ehrlich zu sein, musst du nicht wissen .

    
Stephen C 30.12.2013, 05:17
quelle
1

Wenn es um Nebenläufigkeit geht, gibt es keine "zur gleichen Zeit"; Java stellt sicher, dass jemand zuerst ist.

Wenn Sie nach gleichzeitigem konkurrierendem Zugriff auf Sperrobjekte fragen, ist das die Essenz der gleichzeitigen Programmierung - nichts anderes zu sagen als "es geschieht von Entwurf"

Wenn Sie gleichzeitig ein Objekt als Sperre und als reguläres Objekt verwenden möchten, ist das kein Problem: Es geschieht immer dann, wenn während eines gleichzeitigen Aufrufs einer synchronisierten Methode nicht synchronisierte Methoden verwendet werden Methode (die this als Sperrobjekt verwendet)

    
Bohemian 30.12.2013 05:09
quelle
1

Das Ding, das mit Sperranforderungen arbeitet, kann immer nur eine Sache behandeln; Daher können 2 Threads nicht gleichzeitig nach der Sperre fragen.

Selbst wenn es in der gleichen Mikrosekunde ist, wird man immer noch der anderen voraus sein (vielleicht schneller um eine Nanosekunde). Derjenige, der zuerst fragt, wird das Schloss bekommen. Wer danach fragt, wartet dann auf die Freigabe des Schlosses.

Eine Analogie wird ... Papier zusammenstapeln ... Angenommen, ich habe eine Hand und diese Hand kann nur ein Stück Papier halten. Verschiedene Leute (Fäden) geben mir ein Blatt Papier. Wenn zwei Personen "mir gleichzeitig Papiere anbieten", werde ich eine vor der anderen behandeln.

In Wirklichkeit gibt es nicht so etwas wie zur gleichen Zeit. Der Satz existiert, weil unsere Gehirne nicht bei den Mikro- ... Nano- ... Pikosekundengeschwindigkeiten arbeiten können

Ссылка

    
Gilbert Kuo 30.12.2013 05:10
quelle
1

Sperren werden nicht nur in JVM, sondern auch auf Betriebssystem- und Hardwareebene implementiert, sodass die Mechanismen unterschiedlich sein können. Wir verlassen uns auf Java-API und JVM-Spezifikationen und sie sagen, dass einer der Threads die Sperre erhält, die der andere blockiert.

    
Evgeniy Dorofeev 30.12.2013 05:26
quelle

Tags und Links