У меня были проблемы с 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);
}
}
}
}
... внезапно все мои проблемы с синхронизацией прекратились!
Так почему же начальное кодирование не сработало?