我有一个并发服务器,用户可以选择要显示的选项。每次选择任何选项时,计数器都会递增,仅显示所有选项的总计。不同的选择不需要个别柜台;只需要总数。
在引用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 变量仅递增一次。我希望一次只允许一个客户端访问变量,以确保计数器保持准确。有任何想法吗?
提前致谢。
答案 0 :(得分:1)
您必须使用synchronized
关键字。对计数器的每次访问都应该在synchronized
块中,该块锁定同一个对象:类的static synchronized
方法或显式锁定TheClass.class
的同步块。
答案 1 :(得分:0)
您可能想要使用锁定机制。由于这是一个家庭作业,我想指向Oracle Tutorial
答案 2 :(得分:0)
你被允许使用挥发物吗?
你总是可以使用一些同步来解决这个问题。