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
Initialisieren einer Objektreferenz in einer statischen Initialisierungsfunktion
- # 🎜 🎜#Speichern Sie die Referenz des Objekts im flüchtigen Typfeld oder im AtomicReference-Objekt.
- Speichern Sie die Referenz des Objekts im endgültigen Typfeld eines korrekt konstruierten Objekts #🎜🎜 # Speichern Sie den Verweis des Objekts auf ein durch eine Sperre geschütztes Feld
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.
- 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.
- 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.
- 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!

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver CS6
Visuelle Webentwicklungstools

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

SublimeText3 Linux neue Version
SublimeText3 Linux neueste Version