Peterson解决方案的实施无法正常运行

时间:2014-10-12 13:52:06

标签: java multithreading algorithm

我的学校实施了彼得森的解决方案。我有一些问题。 你可以在最后找到整个代码。

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

我认为如果Peterson的解决方案按预期工作,结果必须等于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])

我的问题是;

  1. 给出不同的工艺参数是否正确 预期结果(结果:0)?
  2. 如果它是正确的,为什么它会在一段时间后卡住?
  3. 谢谢大家!

    彼得森的解决方案实施:

    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");
        }
    }
    

1 个答案:

答案 0 :(得分:-1)

如果两个线程访问共享状态,并且至少有一个线程修改了此共享状态,则需要同步。你的代码没有任何同步,因此输出是不确定的。

阅读http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html,和/或阅读Brian Goetz撰写的Java Concurrency in Practice。