У меня какая-то структура данных, которая имеет методы.
public final class DataStructure {
private final Map<String> _data = ConcurrentHashMap.newKeySet();
public void add(final String s) {
_data.add(s);
}
synchronized public void writeToDisk() {
// code to write _data to disc
_data.clear();
}
}
В моем сценарии у меня есть несколько потоков, которые вызывают DataStructure # add, и в какой-то момент другой поток может вызвать writeToDisk ().
Есть ли способ гарантировать, что никакие данные не будут потеряны, пока один поток вызывает DataStructure # writeToDisk, а другой - DataStructure # add, без добавления синхронизированного с DataStructure # add? Я не хочу этого делать, так как это \ t сильно замедляет мою программу, и маловероятно, что DataStructure # writeToDisk будет вызван.
Точнее, возможно ли заблокировать DataStructure # add для всех потоков тогда и только тогда, когда кто-то входит в writeToDisk, и если да, то как writeToDisk () гарантирует, что в настоящее время никто не находится внутри вызова DataStructure # add?