У меня к вам большой вопрос. Как синхронизировать два разных метода из одного класса, чтобы заблокировать один и тот же объект? Вот пример:
public class MyClass extends Thread implements Observer{
public List<AnotherClass> myList = null;
public MyClass(List<AnotherClass> myList){
this.myList = myList;
}
public void run(){
while(true){
//Do some stuff
myList.add(NotImportantElement);
}
}
public void doJob{
for(int i=0; i<myList.size; i++){
ElementClass x = myList.get(i);
//Do some more stuff
}
}
}
Вопрос в том, как я могу остановить run () от доступа к myList при выполнении doJob и наоборот?
Представьте себе: я запускаю поток и начинаю добавлять элементы в свой список. В случайный момент я вызываю doJob () из другого класса, который содержит ссылку на мой поток.
Как мне сделать блокировку? Спасибо!
Л.Э.
Хорошо, я понял концепцию блокировки, но теперь у меня есть другой вопрос.
Предположим, у меня есть класс с public static myList
и только один экземпляр этого класса. Из этого экземпляра я создаю n
экземпляров Thread
, которые берут каждый элемент этого списка и кое-что с ним делают.
Теперь, в определенный момент, myList
обновляется. Что происходит с теми потоками, которые уже обрабатывали элементы myList? Как мне заблокировать доступ к myList
при его обновлении?