Счетчик для одновременного сервера - PullRequest
1 голос
/ 01 февраля 2012

У меня есть параллельный сервер, где пользователь выбирает опцию для отображения.Каждый раз, когда выбирается любая опция, счетчик увеличивается, отображая только сумму всех выбранных опций.Индивидуальные счетчики НЕ требуются для разных вариантов;требуется только общее количество.

После ссылки на API JAVA самым разумным методом оказалось использование атомарных целых чисел, и все работало идеально, как и ожидалось.

Я произвел следующее:

ServerProtocol.java

public class ServerProtocol {

private static final int ANOTHER = 2;
private static final int OPTIONS = 3;

case OPTIONS:
    if (theInput.equals("1")) {
        theOutput = "computer program description here  -- Another? Y or N";

        DownloadCounter counter = new DownloadCounter();
        counter.incrementCount();
        System.out.println(counter);

        TrackDownloads clientDetails = new TrackDownloads();
        clientDetails.trackLocalhostAddress();
        state = ANOTHER;
case ANOTHER:

DownloadCounter.java

import java.util.concurrent.atomic.AtomicInteger;

public class DownloadCounter {

    private static AtomicInteger count = new AtomicInteger(0);

    public void incrementCount() {
        count.incrementAndGet();
    }

    @Override
    public String toString() {
        return "Total Downloads =" + count;
    }
}

Проблема в том, что мой лектор развернулсяи сказал, что я не могу использовать атомные целые числа!

Они предоставили мне некоторый код, который я должен включить в свой проект.То есть:

 int tmp = yourCounter;
     try {
         Thread.sleep(5000);
     } catch (InterruptedException ex) {
         System.out.println("sleep interrupted");
     }
  yourCounter = tmp + 1;

Проблема в том, что я не могу использовать этот счетчик одновременно.До сих пор я произвел следующее:

ServerProtocol.java

public class ServerProtocol {

private static final int ANOTHER = 2;
private static final int OPTIONS = 3;
private static int yourCounter;

case OPTIONS:
    if (theInput.equals("1")) {
        theOutput = "computer program description here  -- Another? Y or N";

        int tmp = yourCounter;
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
             System.out.println("sleep interrupted");
        }
        yourCounter = tmp + 1;

        System.out.println("Download Total " + yourCounter);

        TrackDownloads clientDetails = new TrackDownloads();
        clientDetails.trackLocalhostAddress();
        state = ANOTHER;
case ANOTHER:    

С помощью вышеуказанного метода, когда 2 или клиенты запрашивают опцию одновременно, переменная yourCounter увеличивается только один раз.Я ожидаю, что только одному клиенту предоставляется доступ к переменной одновременно, чтобы счетчик оставался точным.Есть идеи?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Вы должны использовать ключевое слово synchronized. Каждый доступ к счетчику должен осуществляться в блоке synchronized, который блокирует один и тот же объект: либо метод static synchronized класса, либо синхронизированный блок, который явно блокирует TheClass.class.

.
0 голосов
/ 01 февраля 2012

Вам разрешено использовать летучие вещества?

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

0 голосов
/ 01 февраля 2012

Возможно, вы захотите использовать механизм блокировки. Поскольку это домашнее задание, я бы хотел указать на Oracle Tutorial

...