Я просматривал некоторые PDF-файлы из университетского класса и заметил следующую часть кода:
public class MyMemoryElements {
private String x = "";
public MyMemoryElements(String message){
this.x = message;
}
@Override
public boolean equals(Object o){
if(o instanceof MyMemoryElements ){
MyMemoryElements tmp = (MyMemoryElements)o;
if(tmp.toString().equalsIgnoreCase(this.x))
return true;
return false;
}
return false;
}
@Override
public String toString(){
return this.x;
}
}
и основной код:
public class MainMemory {
private Vector<MyMemoryElements> storage;
private boolean canAccess = true;
private int counter = -1;
public MainMemory(){
storage = new Vector<MyMemoryElements>();
}
public synchronized MyMemoryElements take(String s) {
System.out.print("Method take has been invoked by "+s+". Element is:");
while (!canAccess || storage.size()==counter+1) {
try {
wait();
} catch (InterruptedException e) {}
}
canAccess = false;
counter++;
MyMemoryElements x = storage.elementAt(counter);
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {}
notifyAll();
System.out.println(x.toString());
canAccess = true;
return x;
}
public synchronized void update(MyMemoryElements element) {
System.out.println("Producer is inserting element "+ element.toString());
while (!canAccess) {
try {
wait();
} catch (InterruptedException e) {}
}
canAccess = false;
this.storage.add(element);
notifyAll();
canAccess = true;
}
}
Кажется, я не понимаю, как это нужнодля переменной canAccess
с учетом синхронизации методов (а также причины, по которой флаг изменяется после notifyAll
и не раньше)
РЕДАКТИРОВАНИЕ : дополнительный вопрос:Есть ли смысл во всем этом коде?Я имею в виду все, что он делает, это получает и добавляет что-то к вектору.Разве эти действия не синхронизированы уже на векторах?Весь этот код только для того, чтобы мы могли получить несколько отпечатков?