我非常感谢所提供的所有帮助,但我现在正在努力完成任务的最后一部分,即使增量和减量在交替中发生。我编辑过包括整个主类和类增量器,它包含一个调用 Main.increment 给定次数的for循环(有一个类减量器,其样式与icrementer相同)所以我没有包括它)。你能帮我解决这个问题吗?如果我理解正确,我希望 sharedValue 的值在1和0之间切换。
public class Main extends Thread {
private static int sharedValue = 0;
private static Semaphore semaphore = new Semaphore(1);
public static void increment() {
semaphore.down();
sharedValue++;
semaphore.up();
}
public static void decrement() {
semaphore.down();
sharedValue--;
semaphore.up();
}
static int numberOfCycles = 20000;
public static void main(String[] args) throws InterruptedException {
incrementer inc = new incrementer(numberOfCycles);
inc.start();
inc.join();
decrementer dec = new decrementer(numberOfCycles);
dec.start();
dec.join();
System.out.println(sharedValue);
}}
信号量类
private int count;
// Constructor
public Semaphore(int n) {
count = n;
}
// Only the standard up and down operators are allowed.
public synchronized void down() {
while (count == 0) {
try {
wait(); // Blocking call.
} catch (InterruptedException exception) {
}
}
count--;
}
public synchronized void up() {
count++;
notify();
}
}
增量等级
公共类增量器扩展了线程{
private int numberOfIncrements;
public incrementer(int numOfIncrements){
numberOfIncrements = numOfIncrements;
}
public void run(){
for(int i = 0; i <= numberOfIncrements; i++){
Main.increment();
}
}
}
再次感谢。
答案 0 :(得分:3)
我认为他的意思是受到信号量的保护。所以,你会使用类似的东西:
class ProtectedCount {
private static int sharedValue = 0;
private static Semaphore semaphore = new Semaphore(1);
public void increment() {
semaphore.down(); // wait till the semaphore is available
sharedValue++;
semaphore.up(); // tell everyone that the semaphore is available
}
// same thing for decrement()
}
这表明使用信号量来提供互斥。此用例类似于互斥锁。请参阅semaphore vs. mutex on Wikipedia。
答案 1 :(得分:0)
在Semaphore课程中,您可能需要确保&#34; up&#34;方法不会超过&#34; n&#34;在构造函数中传递。
// Constructor
public Semaphore(int n) {
count = n;
}
public synchronized void up() {
count++; //Ensure count doesn't exceed n.
notify();
}