Под катом программа на Яве. multithreading. volatile там нафиг не нужен, лень убирать. Кто может объяснить, почему она работает именно так, как работает? В спеке и жавадоке не нашел. ( Read more... )
Ну раз совсем никто в теме не оказался, поясню. Тут суть проблемы, что 2 синхронайзед метода в 2х потоках не могут бежать одновременно. При этом 1 из них де факто пускает 2й, не останавливая себя. И надо как-то решать это противоречие.
Нигде в документации не нашел такого, но на самом деле она печаете в порядке 324.
Interruption actions occur upon invocation of method Thread.interrupt, as well as methods defined to invoke it in turn, such as ThreadGroup.interrupt. Let t be the thread invoking u.interrupt, for some thread u, where t and u may be the same. This action causes u's interruption status to be set to true. Additionally, if there exists some object m whose wait set contains u, u is removed from m's wait set. This enables u to resume in a wait action, in which case this wait will, after re-locking m's monitor, throw InterruptedException.Invocations of Thread.isInterrupted can determine a thread's interruption status. The static method Thread.interrupted may be invoked by a thread to observe and clear its own interruption status
( ... )
Ага, мерси. По первой цитате кста камент, который тоже чего-то часто игнорируют, если вылетел эксепшен, то флаг interrupted не взводится. Тоже небось есть в JLS где-нить по этому поводу фраза, но тоже ее еще не нашел.
И ваще ты крут, я вторую болдовую фразу асилил с 20й попытки гдето, после того как нарисовал и то, пришлось додумать, что авторы имели ввиду. Найти ее в JLS так просто, ты крут.
По сути получается notify всегда переводит какойто другой поток из состояния ожидающего в состояние заблокированного, не более. А когда мы освобождаем наш монитор, он уже на общих основаниях пытается продолжится.
Comments 3
(The comment has been removed)
Тут суть проблемы, что 2 синхронайзед метода в 2х потоках не могут бежать одновременно. При этом 1 из них де факто пускает 2й, не останавливая себя. И надо как-то решать это противоречие.
Нигде в документации не нашел такого, но на самом деле она печаете в порядке 324.
Reply
http://java.sun.com/docs/books/jls/third_edition/html/memory.html
17.8.3 Interruptions
Interruption actions occur upon invocation of method Thread.interrupt, as well as methods defined to invoke it in turn, such as ThreadGroup.interrupt. Let t be the thread invoking u.interrupt, for some thread u, where t and u may be the same. This action causes u's interruption status to be set to true.
Additionally, if there exists some object m whose wait set contains u, u is removed from m's wait set. This enables u to resume in a wait action, in which case this wait will, after re-locking m's monitor, throw InterruptedException.Invocations of Thread.isInterrupted can determine a thread's interruption status. The static method Thread.interrupted may be invoked by a thread to observe and clear its own interruption status ( ... )
Reply
И ваще ты крут, я вторую болдовую фразу асилил с 20й попытки гдето, после того как нарисовал и то, пришлось додумать, что авторы имели ввиду. Найти ее в JLS так просто, ты крут.
По сути получается notify всегда переводит какойто другой поток из состояния ожидающего в состояние заблокированного, не более. А когда мы освобождаем наш монитор, он уже на общих основаниях пытается продолжится.
Reply
Leave a comment