У меня есть webapp, который иногда должен загружать некоторые байты из URL-адреса и упаковывать его и отправлять обратно запрашивающему. Загруженные байты хранятся ненадолго, поэтому их можно использовать повторно, если для загрузки требуется один и тот же URL-адрес. Я пытаюсь выяснить, как лучше всего предотвратить одновременное скачивание нитей одного и того же URL-адреса, если запросы поступают одновременно. Я думал создать такой класс, как показано ниже, что не позволяет одновременно загружать один и тот же URL-адрес. Если URL-адрес не может быть заблокирован, он либо ждет, пока его не заблокирует, чтобы попытаться загрузить его, если он не существует после разблокировки.Безопасное создание многопоточных файлов в java
public class URLDownloader
{
HashMap<String,String> activeThreads = new HashMap<String,String>();
public synchronized void lockURL(String url, String threadID) throws UnableToLockURLException
{
if(!activeThreads.containsKey(url))
activeThreads.put(url, threadID)
else
throw UnableToLockURLException()
}
public synchonized void unlockURL(String url, String threadID)
{
//need to check to make sure its locked and by the passed in thread
returns activeThreads.remove(url);
}
public synchonized void isURLStillLocked(String url)
{
returns activeThreads.contains(url);
}
}
У кого-нибудь есть лучшее решение для этого? Мое решение кажется действительным? Есть ли какие-либо компоненты с открытым исходным кодом, которые уже делают это очень хорошо, что я могу использовать?
Благодаря