我在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);
}
}
}
}
...突然我所有的同步问题都停止了!
那么为什么最初的编码工作没有开始呢?