Синхронизация Java на объекте

У меня к вам большой вопрос. Как синхронизировать два разных метода из одного класса, чтобы заблокировать один и тот же объект? Вот пример:

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 при его обновлении?

5
задан Chris Martin 5 November 2014 в 04:01
поделиться