Хит Счетчик Сервлет - PullRequest
       20

Хит Счетчик Сервлет

0 голосов
/ 26 марта 2011

Состояние гонки может возникнуть, даже если действие «проверить и действовать» не предусмотрено, например, в следующем коде десять запросов приведут к десяти потокам, но после этого счетчик не гарантированно будет равен 10. Прежде всего, я прав, говоря это?

private int numPageHits;   
public void doGet(HttpServletRequest request, 
                                 HttpServletResponse response) 
                                       throws IOException, ServletException 
    { 
       //this method executes whenever the servlet is hit 
       //increment numPageHits 
       numPageHits++; 
    }

Одним из решений может быть использование блока синхронизации, например:

synchronize(this) {
    numPageHits++; 
}

Мне просто интересно, есть ли другой способ справиться с этой ситуацией?

Спасибо

Ответы [ 3 ]

3 голосов
/ 26 марта 2011

Использование AtomicInteger и его метод AtomicInteger.addAndGet ()

1 голос
/ 26 марта 2011

Как и предполагалось Пейтон , используйте AtomicInteger или AtomicLong, incrementAndGet() метод будет еще лучше.

Код без synchronized является не только предметом состояния гонки, но и создает проблему видимости потока. См. Ключевое слово volatile.

0 голосов
/ 27 марта 2011

вы правы.++ не является атомарной операцией (даже несмотря на то, что она выглядит так) и поэтому подлежит переупорядочению оптимизаций и переключению контекста потока с помощью модели памяти JVM / Java.

++ технически - это 3 операцииand-set ": 1) получить текущее значение 2) добавить 1 к значению 3) сохранить новое значение

Переключение контекста потока может произойти где угодно в этих 3 шагах, заставляя каждый поток видеть значения diff в любом заданноммомент времени.

это идеальный кандидат для атомщиков, как уже отмечали другие.Вот хорошая ссылка на эту тему: http://www.javamex.com/tutorials/synchronization_concurrency_7_atomic_updaters.shtml

сделать переменную счетчика энергозависимой здесь недостаточно, поскольку новое значение зависит от старого и, следовательно, зависит от условий гонки, вызванных переключением контекста.Вот еще одна хорошая ссылка: http://www.ibm.com/developerworks/java/library/j-jtp06197.html

это очень распространенный вопрос для интервью, кстати ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...