Sichere Veröffentlichung letztendlich unveränderlicher DatenstrukturenJava

Java-Forum
Anonymous
 Sichere Veröffentlichung letztendlich unveränderlicher Datenstrukturen

Post by Anonymous »

Ich habe eine tiefe Datenstruktur, von der ich erwarte, dass Benutzer sie erstellen (aus einer Datenquelle), Daten daraus extrahieren (in ihre eigenen Datenstrukturen) und sie dann wegwerfen. Die Datenstruktur ist praktisch unveränderlich: In einer Single-Thread-Welt kann keine öffentliche Funktion ihr Verhalten im Laufe der Zeit ändern.
Ich weiß jedoch auch, dass Benutzer sich meistens nur um eine Teilmenge der gespeicherten Daten kümmern, sodass sie intern träge initialisiert werden: Beim ersten Zugriff auf jedes Feld werden die Daten berechnet und für zukünftige Verwendungen gespeichert.
In einigen wenigen Fällen kann es für Benutzer nützlich sein, diese Datenstrukturen beizubehalten und zu teilen sie zwischen Threads. So wie es aussieht, ist dies eindeutig unsicher, da die verzögerte Initialisierungslogik voller Check-then-Act-Probleme sein wird.
Ich sehe die folgenden Lösungen:
  • Duplizieren Sie die Klassen in echte unveränderliche Alternativen. Da die Hierarchie ziemlich groß und komplex ist, würde ich es lieber vermeiden, das alles pflegen zu müssen.
  • Eine Möglichkeit finden, die Datenstruktur einzufrieren, so dass sie anschließend wirklich unveränderlich ist. Zum Glück ist das dasselbe wie eine eifrige Initialisierung von allem.
Daher gehe ich in die Richtung:

Code: Select all

public class DataStructure {

private final Map cache = new LinkedHashMap();

public Datum get(index i) { … }
public int size() { … }

public void eager() {
for (int i = 0; i < size(); i++)
get(i);
}

}
Die Methode „eifrig()“ ist nicht threadsicher. Meine Absicht ist, dass das Objekt nach der Rückkehr von eifrig() unveränderlich und somit threadsicher ist. Meine Absicht ist es, dass Benutzer, die Thread-Sicherheit wünschen, eifrig() direkt nach der Erstellung aufrufen können, bevor sie das Objekt für andere Threads freigeben.
Ich lese jedoch „Java Concurrency in Practice“ und dort wird erwähnt, dass die sichere Veröffentlichung über finale-Felder erfolgt. In dieser Klasse gibt es keine finalen-Felder.
Ist diese Klasse threadsicher, nachdem eifrig() aufgerufen wurde? Wenn dies nicht der Fall ist, wie kann ich es so ändern, ohne Kosten für den Happy-Path zu zahlen, bei dem Eager() niemals aufgerufen wird und Thread-Sicherheit nicht erforderlich ist?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post