Нао робот перестал узнавать и отвечать на произнесенные слова

synchronized работают на уровне экземпляра. Каждый экземпляр класса получает свой собственный замок. Блокировка приобретается каждый раз, когда вводится любой метод synchronized экземпляра. Это предотвращает вызов нескольких потоков, вызывающих synchronized методы в том же экземпляре (обратите внимание, что это также предотвращает вызов разных методов synchronized в одном экземпляре).

Теперь, поскольку у вас есть два экземпляра вашего класса, каждый экземпляр получает свою собственную блокировку. Нет ничего, чтобы предотвратить одновременное использование обоих потоков в своем экземпляре одновременно.

Если вы хотите предотвратить это, вы можете иметь блок synchronized(obj) внутри run(), где obj будет объект, общий для обоих экземпляров вашего класса:

class MyThread2 implements Runnable {
   private static final Object lock = new Object();
   ...
   public void run() {
     synchronized(lock) {
       ...
     }
   }
}
-1
задан karel 2 March 2019 в 05:15
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: