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>
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.
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.
Initialisieren einer Objektreferenz in einer statischen Initialisierungsfunktion
Safe Shared Object Policy
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!