2016-02-12 2 views
5

Как мы можем получить доступ к нескольким параллельным структурам данных при сохранении безопасности потоков? Можно ли сделать это без синхронизации?Безопасный доступ к нескольким параллельным структурам данных

В качестве простого примера:

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)) уже не так.

Есть ли способ справиться с этим, кроме как добавить замок?

+3

Это хороший вопрос, который был опасно близок к вне темы по причине запроса внешних источников (например, примеров). Я переформулировал это, чтобы избежать этой проблемы. Вы можете вернуться или отредактировать, если чувствуете, что это слишком много изменений. Вы можете просмотреть [help], а также прочитать [ask] для указателей. –

+0

для этого конкретного примера, как вы сказали, он не работает полностью, в зависимости от гарантий, которые вам необходимо предоставить (т. Е. Может быть, если m немного отстает от l). в общем случае вы не можете ответить на этот вопрос. – jtahlborn

ответ

0

Если, например, объект, который вы поместили в список l, не будет заменен, а изменятся только значения, содержащиеся в объекте Node, тогда вам не понадобится блокировка. Но это будет сложно реализовать, так как вам нужно будет заполнить свой массив пустыми объектами в начале вашей программы.

Тогда все объекты, извлеченные из списка, будут такими же, как в списке, и вы будете в безопасности.

Смежные вопросы