Как заблокировать метод, только если вызывается другой метод - PullRequest
1 голос
/ 28 апреля 2019

У меня какая-то структура данных, которая имеет методы.

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?

...