На Android у меня есть одна хеш-таблица и два потока, которые могут получить к ней доступ. - доступ потока пользовательского интерфейса к нему с помощью containsKey, get и put - доступ к нему другого потока с помощью containsKey, get и put и итератора
Я знаю, что хэш-таблица является потокобезопасной, но уверен?
Одна вещь, которую я не понимаю: почему приложение не взрывается, если один поток не видит, что одно значение было удалено из хеш-таблицы, и поток выполняет итерацию по этому объекту?
Как мы можем определить хеш-таблицу потокобезопасной, если итератор не является?
EDIT: Но теперь я более конкретно расскажу вам о своей проблеме, потому что по-другому я не понимаю. Ниже сообщается код моего concurrentHashMap :
public ConcurrentHashMap<String,Result> Holder = new ConcurrentHashMap<String,Result>();
class Result
{
public float goal = 0;
public float min = 0;
public float max = 0;
public float seconds = 0;
//lastaccess indicate the time of the last access of this Result
public float lastaccess = 0;
public boolean triggered = false;
}
Теперь один поток B повторяет каждые "x" секунд объект Result и для каждого ключа, хранящегося в Holder ConcurretHashMap .
Другой поток задает новый Результат для нового ключа или редактирует Результат для существующего.
Я хочу выполнить операцию обновления результата атомарным способом, но объект внутри хэш-карты меня пугает.
Поток UX удаляет все элементы из Holder каждые x секунд. Чтобы выполнить эту операцию, я сделал это следующим образом: я создал
mlock объекта = новый объект();
в треде B
syncrhonized(mlock)
{
//all the thread B function.
// Iterate on all of the Holder item
}
в другом потоке C, когда ему нужно вызвать Holder.clear(), я сделал это следующим образом:
syncronized(mlock)
{
Holder.clear();
}
- Это правильный способ предотвратить итерацию потока B на держателе с несогласованными данными?