This question already has answers here:
Peterson algorithm in Java?
(5个答案)
我的学校实施了彼得森的解决方案我对此有些问题。
你可以在最后找到整个代码。
Firsly;两个线程(AddOne和SubOne)使用相同的进程值“0”进入和离开临界区域是否正确。
代码的输出如下:
我认为,如果彼得森的解按预期工作,结果必须等于0但他们都不一样。
所以我把类AddOne改成这样:给一个不同的参数。
这给了我我期望的结果:
但这一次,在一两秒钟后,程序进入无限循环,不向屏幕打印任何内容。我认为它卡在这个
我的问题是;
给出不同的工艺参数以获得
预期结果(结果:0)?
如果是正确的,为什么过了一段时间就卡住了?
谢谢大家!
彼得森的解决方案实施:
(5个答案)
我的学校实施了彼得森的解决方案我对此有些问题。
你可以在最后找到整个代码。
Firsly;两个线程(AddOne和SubOne)使用相同的进程值“0”进入和离开临界区域是否正确。
PetersonsSolution.enter_region(0); //Both use 0 as paramater.
代码的输出如下:
++ finihed
-- finished
Result: 0
++ finihed
-- finished
Result: -49
-- finished
++ finihed
Result: -64
++ finihed
-- finished
Result: -54
...ans so on
我认为,如果彼得森的解按预期工作,结果必须等于0但他们都不一样。
所以我把类AddOne改成这样:给一个不同的参数。
class AddOne extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
PetersonsSolution.enter_region(1); //give 1 as paramater.
PetersonsSolution.myValue++;
PetersonsSolution.leave_region(1); //give 1 as paramater.
}
System.out.println("++ finihed");
}
}
这给了我我期望的结果:
-- finished
++ finihed
Result: 0
++ finihed
-- finished
Result: 0
但这一次,在一两秒钟后,程序进入无限循环,不向屏幕打印任何内容。我认为它卡在这个
while(turn == process && interested[other])
我的问题是;
给出不同的工艺参数以获得
预期结果(结果:0)?
如果是正确的,为什么过了一段时间就卡住了?
谢谢大家!
彼得森的解决方案实施:
public class PetersonsSolution {
static int myValue = 0;
static int turn;
static boolean interested[] = {false, false};
public static void main(String[] args) throws Exception {
while (true) {
AddOne add = new AddOne();
SubOne sub = new SubOne();
add.start();
sub.start();
add.join();
sub.join();
System.out.println("Result: " + myValue);
}
}
public static void enter_region(int process){
int other;
other = 1 - process;
interested[process] = true;
turn = process;
while(turn == process && interested[other]){
//System.out.println("waiting");
}
}
public static void leave_region(int process){
interested[process] = false;
}
}
class AddOne extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
PetersonsSolution.enter_region(0);
PetersonsSolution.myValue++;
PetersonsSolution.leave_region(0);
}
System.out.println("++ finihed");
}
}
class SubOne extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
PetersonsSolution.enter_region(0);
PetersonsSolution.myValue--;
PetersonsSolution.leave_region(0);
}
System.out.println("-- finished");
}
}
最佳答案
如果两个线程访问共享状态,并且至少有一个线程修改了此共享状态,则需要同步您的代码没有任何同步,因此输出是不确定的。
Readhttp://docs.oracle.com/javase/tutorial/essential/concurrency/index.html,和/或Read Java Concurrency in Practice,作者Brian Goetz。
08-17 04:27