Heim >Java >javaLernprogramm >Wie veröffentliche und vermeide ich Objekt-Escape-Probleme in Java?

Wie veröffentliche und vermeide ich Objekt-Escape-Probleme in Java?

WBOY
WBOYnach vorne
2023-04-22 14:37:081008Durchsuche

Objekt veröffentlichen

Einfach ausgedrückt besteht es darin, einen Verweis auf ein Objekt bereitzustellen, um Code außerhalb des Gültigkeitsbereichs zu codieren. Geben Sie beispielsweise ein Objekt zurück oder übergeben Sie es als Parameter an eine Methode anderer Klassen.

Unsicher zum Posten an: Beispiel:

<code>@Slf4j</code><code>@NotThreadSafe</code><code>public class UnsafePublish {</code><code><br></code><code>    private String[] states = {"a", "b", "c"};</code><code><br></code><code>    public String[] getStates() {</code><code>        return states;</code><code>    }</code><code><br></code><code>    public static void main(String[] args) {</code><code>        UnsafePublish unsafePublish = new UnsafePublish();</code><code>        log.info("{}", Arrays.toString(unsafePublish.getStates()));</code><code>        // 发布对象不安全,可被修改</code><code>        unsafePublish.getStates()[0] = "d";</code><code>        log.info("{}", Arrays.toString(unsafePublish.getStates()));</code><code>    }</code><code>}</code>

Objekt-Escape

Wenn eine Klasse vor Abschluss der Konstruktion einen Objektverweis auf den externen Code bereitgestellt hat, wird dies als Objekt-Escape bezeichnet Thread-Sicherheit.

<code>public class Escape {</code><code>    private int thisCanBeEscape = 1;</code><code><br></code><code>    public Escape() {</code><code>        new InnerClass();</code><code>        // 还有业务需要执行</code><code>        thisCanBeEscape++;</code><code>    }</code><code><br></code><code>    private class InnerClass {</code><code>        public InnerClass() {</code><code>            log.info("{}", Escape.this.thisCanBeEscape);</code><code>        }</code><code>    }</code><code><br></code><code>    public static void main(String[] args) {</code><code>        new Escape();</code><code>    }</code><code>}</code>
  • Die Instanz dieser inneren Klasse enthält einen Verweis auf das private Domänenobjekt der gekapselten Instanz. Es kann sein, dass es dort ist Es sind unsichere Faktoren darin enthalten, die dazu führen, dass dieser Verweis während der Konstruktion überläuft.

  • Der obige Code startet einen Thread während der Funktionskonstruktion. Unabhängig davon, ob es sich um einen impliziten Start oder einen expliziten Start handelt, führt dies zu einem Überlauf dieser Referenz. Der neue Thread sieht immer das besitzende Objekt, bevor es erstellt wird.

Erklärung von Klassenname.this

Die Syntax von „Klassenname.this“ heißt in der Java-Sprache „qualifizierte dies“. Der Hauptzweck dieser Syntax ist: Wenn Sie in der Methode einer inneren Klasse die „this“-Referenz einer äußeren Klasse auf einer bestimmten verschachtelten Ebene angeben möchten, verwenden Sie die Syntax „name der äußeren Klasse.this“. Zum Beispiel:

class Foo {  class Bar {    Foo getFoo() {      return Foo.this;    }  }}

Wenn Sie in der getFoo()-Methode in der Foo.Bar-Klasse „this“ direkt schreiben, verweist es auf die Instanz der Foo.Bar-Klasse, und wenn Sie dies angeben möchten, bezieht sich dies auf die periphere Foo-Klasse. Beispielsweise würde sie als Foo.this geschrieben werden. Insbesondere wenn Sie Bar.this im obigen Beispiel in die Methode getFoo() schreiben, ist der Effekt derselbe, als würden Sie dies direkt schreiben und die aktuelle Foo.Bar-Klasseninstanz angeben.

Sichere Freigabe von Objekten

  1. Initialisieren einer Objektreferenz in einer statischen Initialisierungsfunktion

  2. # 🎜 🎜#Speichern Sie die Referenz des Objekts im flüchtigen Typfeld oder im AtomicReference-Objekt.

  3. Speichern Sie die Referenz des Objekts im endgültigen Typfeld eines korrekt konstruierten Objekts #🎜🎜 #

  4. Speichern Sie den Verweis des Objekts auf ein durch eine Sperre geschütztes Feld
Sie Sie können eine Bestellung bei Lenovo aufgeben. Im Beispielmodus: Hungriger-Mann-Modus/Lazy-Man-Modus.

Safe Shared Object Policy

    Thread-Einschränkung: Ein Thread-begrenztes Objekt ist exklusiv für den Thread und kann nur verwendet werden vom Thread geändert.
  1. Freigegebenes schreibgeschütztes Objekt: Auf ein gemeinsam genutztes schreibgeschütztes Objekt können mehrere Threads gleichzeitig ohne zusätzliche Synchronisierung zugreifen, aber kein Thread kann es ändern.
  2. Thread-sicheres Objekt: Ein Thread-sicheres Objekt oder Container, das intern einen Synchronisierungsmechanismus verwendet, um Thread-Sicherheit zu gewährleisten, sodass andere Threads die öffentliche Schnittstelle ohne zusätzliche Synchronisierung passieren können Besuchen Sie es gerne.
  3. Geschütztes Objekt: Auf das geschützte Objekt kann nur durch den Erwerb einer bestimmten Sperre zugegriffen werden.

Das obige ist der detaillierte Inhalt vonWie veröffentliche und vermeide ich Objekt-Escape-Probleme in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen