Программа, похоже, игнорирует строку synchronized () - PullRequest
0 голосов
/ 11 ноября 2018

У меня были проблемы с ArrayList, который, как я определил, мог быть вызван только ошибкой синхронизации. В это было трудно поверить, так как я кодировал свою программу, чтобы убедиться, что манипуляции с ArrayList были правильно синхронизированы.

Я создал решение, но понятия не имею, почему оно работает, когда исходный код не работает.

Так обычно выглядела договоренность с самого начала.

public class MasterClass {

    private ArrayList<SlaveClass> list;

    public MasterClass() {
        list = new ArrayList<SlaveClass>();
    }

    public synchronized Object conductOpperation() {
        //Numerous SlaveClasses are created here and executed.
        //Opperation returns it's result when all the SlaveClasses have finished their run.
    }

    private MasterClass master() {
        return this;
    }

    public class SlaveClass extends Thread {

        public SlaveClass() {
            list.add(this);
        }

        public void run() {
            //Code
            synchronized(master()){
                list.remove(this);
            }
        }

    }
}

Поведение «valuList ()» было чрезвычайно странным, поскольку, как я позже выяснил, синхронизация не блокировалась, когда классы Slave завершали свои операции и удаляли себя из «списка».

Однако, когда я сделал эту незначительную модификацию кода:

public class MasterClass {

    private ArrayList<SlaveClass> list;

    public MasterClass() {
        list = new ArrayList<SlaveClass>();
    }

    public synchronized Object conductOpperation() {
        //Numerous SlaveClasses are created here and executed.
        //Opperation returns it's result when all the SlaveClasses have finished their run.
    }

    private MasterClass master() {
        return this;
    }

    private synchronized void removeSlave(SlaveClass s) {
        slave.remove(s);
    }

    public class SlaveClass extends Thread {

        public SlaveClass() {
            list.add(this);
        }

        public void run() {
            //Code
            synchronized(master()){
                removeSlave(this);
            }
        }

    }
}

... внезапно все мои проблемы с синхронизацией прекратились!

Так почему же начальное кодирование не сработало?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...