Wichtigkeit der Dokumentation der Thread-Sicherheit
- Teil des Klassenvertrags: Wie eine Klasse mit gleichzeitigem Zugriff umgeht, ist für ihre Clients von entscheidender Bedeutung.
Risiken falscher Annahmen:
- Schlechte oder übermäßige Synchronisierung (Punkte 78 und 79).
- Schwerwiegende Fehler im Programmverhalten.
Probleme bei der Verwendung der Synchronisierung als Indikator
- Implementierungsdetail: Nicht Teil der öffentlichen API.
- Vereinfachte Sichtweise: Thread-Sicherheit ist keine binäre Eigenschaft (alles oder nichts); Es gibt verschiedene Ebenen.
Thread-Sicherheitsstufen
Unveränderlich:
- Sie verhalten sich wie Konstanten.
- Keine externe Synchronisierung erforderlich.
- Beispiele: String, Long, BigInteger.
Bedingungslos Thread-sicher:
- Veränderliche Instanzen, aber mit ausreichender interner Synchronisierung.
- Sichere gleichzeitige Nutzung ohne zusätzliche Synchronisierung.
- Beispiele: AtomicLong, ConcurrentHashMap.
Bedingt Thread-sicher:
- Ähnlich wie unbedingt, aber einige Methoden erfordern eine externe Synchronisierung.
- Beispiel: Collections.synchronized, die beim Iterieren eine Synchronisierung erfordern:
Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
synchronized (syncMap) {
for (String key : syncMap.keySet()) {
// Iteração segura
}
}
Nach dem Login kopieren
Keine Thread-Sicherheit:
- Es müssen Methoden mit externer Synchronisierung einbezogen werden.
- Beispiele: ArrayList, HashMap.
Feind gegen Thread:
- Sie sind auch bei externer Synchronisierung nicht sicher.
- Normalerweise das Ergebnis von Fehlern, z. B. der Änderung statischer Daten ohne Synchronisierung.
So dokumentieren Sie die Thread-Sicherheit
Klare Dokumentation in Javadoc:
- Gebotene Sicherheitsstufe.
- Methoden oder Sequenzen, die eine externe Synchronisierung erfordern.
- Spezifische zu verwendende Sperren.
Beispiel einer Synchronisationsdokumentation für die Iteration:
/**
* É necessário sincronizar manualmente ao iterar sobre as views deste mapa.
* Exemplo:
* synchronized (map) {
* for (Object key : map.keySet()) {
* // Iteração segura
* }
* }
*/
Nach dem Login kopieren
Verwendung eines privaten Sperrobjekts
Vorteile:
- Vermeidet Störungen durch Clients und Unterklassen.
- Ermöglicht in Zukunft eine ausgefeiltere Parallelitätskontrolle.
Beispiel:
private final Object lock = new Object();
public void threadSafeMethod() {
synchronized (lock) {
// Código protegido
}
}
Nach dem Login kopieren
Letzte Felder: Schutz vor versehentlichen Änderungen am Sperrobjekt.
Sorgfalt beim Entwerfen von Klassen für die Vererbung
- Die Verwendung derselben Sperre in Unterklasse und Basisklasse kann zu Störungen führen.
- Private Sperre bevorzugen, um Konflikte zu vermeiden.
Abschließende Zusammenfassung
- Dokumentieren Sie immer die Thread-Sicherheit einer Klasse (mit Text oder Notizen).
- Verlassen Sie sich beim Dokumentieren nicht nur auf den synchronisierten Modifikator.
- Für bedingungslos threadsichere Klassen sollten Sie die Verwendung privater Sperrobjekte in Betracht ziehen.
- Bedingt threadsichere Klassen müssen angeben, welche Sperren wann verwendet werden sollen.
Das obige ist der detaillierte Inhalt vonArtikel Dokumentieren Sie eine Thread-Sicherheit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!