程序似乎忽略了synced()行

时间:2018-11-11 19:24:31

标签: java synchronized

我在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);
            }
        }

    }
}

“ evaluateList()”的行为非常奇怪,因为,正如我后来发现的那样,当SlaveClasses完成其操作并将其从“列表”中删除时,它没有被同步锁定。

但是,当我对代码进行此较小的修改时:

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

    }
}

...突然我所有的同步问题都停止了!

那么为什么最初的编码工作没有开始呢?

0 个答案:

没有答案