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?
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. –
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