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
Freigeben: 2023-04-22 14:37:08
nach vorne
988 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren
  • 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;    }  }}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage