并发服务器的计数器

时间:2012-02-01 15:12:09

标签: java concurrency client-server

我有一个并发服务器,用户可以选择要显示的选项。每次选择任何选项时,计数器都会递增,仅显示所有选项的总计。不同的选择不需要个别柜台;只需要总数。

在引用JAVA API之后,最明智的方法似乎是使用原子整数,一切都按预期完美运行。

我制作了以下内容:

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 个答案:

答案 0 :(得分:1)

您必须使用synchronized关键字。对计数器的每次访问都应该在synchronized块中,该块锁定同一个对象:类的static synchronized方法或显式锁定TheClass.class的同步块。

答案 1 :(得分:0)

您可能想要使用锁定机制。由于这是一个家庭作业,我想指向Oracle Tutorial

答案 2 :(得分:0)

你被允许使用挥发物吗?

你总是可以使用一些同步来解决这个问题。