Почему wait()
внутри синхронизированного блока? Я имею в виду, что только один поток войдет в синхронизированный блок, так как может другой поток выполнить команду wait()
?Зачем ждать внутри синхронизированного?
ответ
- Синхронизированное ключевое слово используется для эксклюзивного доступа.
- Чтобы синхронизировать метод, просто добавьте синхронизированное ключевое слово в его объявление. Тогда никакие два вызова синхронизированных методов на одном и том же объекте не могут чередоваться друг с другом.
- Синхронизированные операторы должны указывать объект, который обеспечивает внутреннюю блокировку. Когда используется синхронизация (это), вам необходимо избегать синхронизации вызовов других методов объектов.
- wait() сообщает вызывающему потоку отказаться от монитора и перейдет в режим сна, пока какой-либо другой поток не войдет в тот же монитор и не вызовет notify().
- notify() просыпается первый поток, который вызывает wait() на том же объекте.
Пример:
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
try{
System.out.println("Waiting for b to complete...");
b.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
Понял от: http://www.programcreek.com/2009/02/notify-and-wait-example/
Почему 'synchronized (this)' вызывается в 'ThreadB'? Разве не только сам поток вызывает run, но и другие потоки? – Artemkller545
Когда я пробовал работать без этого синхронизированного блока, я получил java.lang.IllegalMonitorStateException, это интересно. Когда threadA синхронизируется по b, ему нужна гарантия того, что notify() также синхронизируется, или другой экземпляр может вызвать уведомление. –
Why is wait() inside of a synchronized block?
Поскольку поток должен иметь монитор объекта вы звоните wait()
на, в случае синхронизированного метода, то this
объект.
I mean, only one thread will enter the synchronized block, so how can the other
thread execute the wait() instruction?
Он может не только нить внутри синхронизированного блока может выполнять wait()
, позволяя другим потокам, чтобы войти в синхронизированный блок.
«почему [foo.] Wait [required to be] внутри [synchronized (foo)]?» Вы в основном сказали: «Потому что это требует». Лучше ответит _why_. Полный ответ слишком велик для этого пространства, но в двух словах; вызывающий 'foo.wait()' должен ждать некоторого явного, проверяемого условия и, чтобы избежать «потерянных уведомлений», каждый блок кода, который может протестировать или изменить условие (включая официанта), должен быть синхронизирован по тот же замок. Java не может гарантировать, что каждый блок кода синхронизирован, но он делает это для блока, который ждет() s и блока, который уведомляет(). –
- 1. Зачем ждать и уведомлять о вызове из синхронизированного блока/метода?
- 2. Зачем ждать() всегда называется внутри цикла
- 3. Ожидание семафора внутри синхронизированного метода
- 4. Java: синхронизировать объект внутри другого синхронизированного объекта
- 5. BlockedLinkedQueue тупикового внутри синхронизированного метода
- 6. java - переупорядочение внутри синхронизированного блока
- 7. Зачем мне нужно ждать сопрограммы?
- 8. Зачем ждать MessageDialog в конструкторе страницы?
- 9. Поведение синхронизированного
- 10. HashMap итератора при использовании внутри синхронизированного метода
- 11. Побочные эффекты бросания исключения внутри синхронизированного предложения?
- 12. Изменение объекта блокировки внутри @ синхронизированного раздела
- 13. Выполнение нового потока внутри синхронизированного блока
- 14. Смешивание синхронизированного() с ReentrantLock.lock()
- 15. Различные выходные данные для синхронизированного метиса и синхронизированного объекта
- 16. Зачем ждать Тема Не ждет навсегда
- 17. python: Зачем мне заставлять меня ждать?
- 18. Зачем ждать асинхронных вызовов веб-сервисов
- 19. Зачем мне ждать <identifier>?
- 20. Транспортир, сделанный и ожидающий, зачем нам ждать?
- 21. Зачем ждать метод async в середине метода?
- 22. Зачем ждать SIFS перед отправкой ACK?
- 23. Вызов синхронизированного метода из нового потока, созданный внутри другого синхронизированного метода того же класса в Java
- 24. Синхронизация синхронизированного списка
- 25. C# ждать задачи внутри цикла
- 26. Multiple ждать внутри метода асинхронной
- 27. Как ждать перезагрузки замка?
- 28. ли не ждать при использовании ForEachAsync с ждать внутри действий
- 29. синхронизированный (этот) блок в рамках синхронизированного метода
- 30. Зачем определять функцию внутри $()?
Какой 'synchronized' блок вы говорите? Ваш вопрос действительно нечеткий (и широкий тоже) ... – BackSlash
Ни один из ответов, здесь или в дубликате, не упоминает ключевую причину: 'notifyAll' будет полным беспорядком без требования переобучения блокировки, прежде чем продолжить , –
Это потому, что, прежде чем вы можете что-то ждать, вы должны убедиться, что что-то еще не произошло. И вы должны убедиться, что это не так, как вы ждёте. Поэтому вы должны держать блокировку, чтобы ждать чего-то - блокировки, которая защищает то, что вы ожидаете от изменения состояния. –