Frage

Immer wenn ein neues Objekt erstellt wird, wird das Objekt auf Heap erstellt. Der Speicher für jedes Objekt zugeordnet hat zwei zusätzliche Felder 1) Der Typ Objektzeiger 2) Synchronisationsblockindex.

Was genau ist die Verwendung dieser beiden Felder aus. Kann jemand Licht in diese?

War es hilfreich?

Lösung

Die Art Objektzeiger wird verwendet, um den Typ des Objekts darzustellen. Dies ist erforderlich für:

  • Methode lookup (die V-Tabelle)
  • Überprüfen Abgüsse
  • Das Finden der Type Objekt, wenn Sie GetType nennen.

Das Synchronisationsblock-Feld wird für die Verriegelung eingesetzt. Es ist nur ausgefüllt, wenn es sein muss, und wenn eine Sperre immer unbestritten ist die CLR macht mit einem „dünnen“ lock zu tun, die keine externen Daten erfordern. Ansonsten ist es ein Eintrag in einer prozessweiten Tabelle - ich weiß nicht, die Details von dem, was in der Tabelle, aber ich könnte mir vorstellen, es ist Dinge wie eine Liste von Threads auf dem Objekt Monitor warten. Natürlich ist das wichtigste Bit an Information ist, ob die Sperre zur Zeit gehalten wird, durch den Faden, und was seine Zählung (aufgrund der einspringenden Natur von .NET Sperren) ist.

Der Synchronisationsblock auch in gefüllt ist, wenn Sie GetHashCode() nennen und es ist nicht außer Kraft gesetzt - es nutzt die prozessweiten Tabelle, eine stabile Zahl zuzuordnen, im Grunde. (Die Adresse des Objektes ist nicht gut genug, wie es im Laufe der Zeit ändern kann.)

Andere Tipps

Type-Objekt ist das, was durch obj.GetType Aufruf zurückgegeben

Sync-Block für die Synchronisierung verwendet

Siehe auch:

Der Sync-Block-Index unter der Haube von der Monitor-Klasse verwendet wird und damit auch die lock-Anweisung.

Einige Bits von Sync-Block-Index werden auch durch GC verwendet, um ein Objekt als Müll zu markieren, falls es nicht mehr referenziert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top