Основная проблема заключается в том, что у вас есть два потока, которые выполняют get, increment и set, поэтому рассмотрим следующую ситуацию:
Thread 1: set(5) // now count is 5
Thread 1: get() // Thread 1 gets 5
Thread 2: get() // Thread 2 gets 5
Thread 2: increments its local copy of count to 6
Thread 1: increments its local copy of count to 6
Thread 2: set(6) // now the count is 6
Thread 1: set(6) // the count is still 6, but it should be 7!!!
Решение состоит в том, чтобы реализовать метод приращения, который увеличивает счетчик потокобезопасным способом:
public synchronized void increment()
{
count++;
}
Вы также можете использовать AtomicInteger
и избежать блокировки:
AtomicInteger count = new AtomicInteger(0);
public int getCount()
{
return count.get();
}
public void increment()
{
count.incrementAndGet();
}
Вы также заявили, что счетчик должен подсчитывать количество загрузок для каждого элемента, однако ваш текущий код этого не сделает. Ваш текущий счетчик будет подсчитывать ВСЕ загрузки для ВСЕХ предметов. Подсказка: вы делаете все в DownloadCounter
статично, и это не будет работать хорошо, если вы хотите иметь отдельный счетчик для каждого элемента.