2016-02-12 9 views
5

Wie können wir auf mehrere gleichzeitige Datenstrukturen zugreifen, während die Threadsicherheit erhalten bleibt? Ist es möglich, dies ohne Synchronisation zu tun?Threadsicherer Zugriff auf mehrere gleichzeitige Datenstrukturen

Als einfaches Beispiel:

ConcurrentHashmap m; 
CopyOnWriteArrayList l; 

public bool enterListNode(int elem) { 
    Node node = l.get(elem); 
    String key = node.key(); //key is immutable 
    int val = node.val(); //val is immutable 
    val = m.putIfAbsent(key, val); 
    return val; 
} 

Dieses Beispiel ist nicht linearisierbar, weil es möglich ist, dass, wenn wir putIfAbsent(key, val) tun, dass (node==l.get(elem)) nicht mehr wahr ist.

Gibt es eine Möglichkeit, mit dieser anderen als das Hinzufügen einer Sperre umzugehen?

+3

Dies ist eine gute Frage, die wegen der Nachfrage nach externen Quellen (d. H. Beispiele) gefährlich nahe am Off-Thema war. Ich habe es neu formuliert, um dieses Problem zu vermeiden. Sie können den Vorgang rückgängig machen oder bearbeiten, wenn Sie das Gefühl haben, dass dies zu stark ist. Vielleicht möchten Sie die [Hilfe] überprüfen und auch [fragen] nach Zeigern lesen. –

+0

für dieses spezielle Beispiel, wie Sie gesagt haben, es funktioniert nicht vollständig, abhängig von den Garantien, die Sie bereitstellen müssen (d. H. Es kann in Ordnung sein, wenn m ein wenig hinter l ist). Im allgemeinen Fall können Sie diese Frage nicht wirklich beantworten. – jtahlborn

Antwort

0

Wenn das Objekt, das Sie in die Liste l eingeben, niemals ersetzt wird, aber nur die Werte im Objekt Node geändert werden, brauchen Sie keine Sperre. Es wird jedoch schwierig zu implementieren sein, da Sie Ihr Array zu Beginn Ihres Programms mit leeren Objekten füllen müssen.

Dann sind alle Objekte aus der Liste die gleichen wie in der Liste und Sie sind sicher.