Как мы можем получить доступ к нескольким параллельным структурам данных при сохранении безопасности потоков? Можно ли сделать это без синхронизации?Безопасный доступ к нескольким параллельным структурам данных
В качестве простого примера:
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;
}
Этот пример не линеаризуемых, потому что это возможно, что, когда мы делаем putIfAbsent(key, val)
, что (node==l.get(elem))
уже не так.
Есть ли способ справиться с этим, кроме как добавить замок?
Это хороший вопрос, который был опасно близок к вне темы по причине запроса внешних источников (например, примеров). Я переформулировал это, чтобы избежать этой проблемы. Вы можете вернуться или отредактировать, если чувствуете, что это слишком много изменений. Вы можете просмотреть [help], а также прочитать [ask] для указателей. –
для этого конкретного примера, как вы сказали, он не работает полностью, в зависимости от гарантий, которые вам необходимо предоставить (т. Е. Может быть, если m немного отстает от l). в общем случае вы не можете ответить на этот вопрос. – jtahlborn