Собеседование по Java Concurrency
От: Golovach Ivan Украина http://kharkovitcourses.blogspot.com
Дата: 01.12.09 17:24
Оценка: 104 (17) +2
-----------------------------------------------------------------
Приношу извинения за специфичный тон, просто этот материал написан не для форума. Переписывать — лениво, а не публиковать — жаль материала.
-----------------------------------------------------------------

В последнее время во многих вакансиях на Java Developer появилось требование знания Java Concurrency/Multithreading. В ответ многие разработчики тут же добавили такую строчку себе в резюме. Я как человек, который проводит собеседования, хотел бы развеять некоторые недоразумения относительно этого термина.
Все проекты связанные с многопоточностью я бы разделил на 3 класса: использующие многопоточность, основанные на многопоточности и те, которые и есть сама многопоточность. К первому классу("использующие") я бы отнес проекты, которые предполагают работу в многопоточной среде. Пример: есть класс BlaBlaBlaFactory, в документации необходимо указать, может ли эта фабрика использоваться одновременно несколькими потоками или нет. Если нет, то сделать ее потокобезопасной с помощью ReentrantLock. Ко второму классу ("основанные на") я бы отнес проекты, в которых использование нескольких потоков является одним из ключевых моментов. Пример: многопоточный кодек видео формата H.264. К третьему классу ("являются ей") я бы отнес проекты, в корне что-то меняющие в отношении потоков. Пример: написание runtime-среды для языка Scala (на Java) с реализацией легковесных потоков и своеобразной моделью памяти.
Так вот, дело в том, что разработчик зачастую указывает на свое знание java concurrency имея в виду первый уровень. Компания же может иметь в виду второй (написание высоконагруженного сервера, написание физического/AI ядра 3D-шутера, написание OLAP-системы — во всех случаях с требованием ОДИН запрос пользователя обрабатывать в НЕСКОЛЬКО потоков). Иногда разработчики не знают про существование уровней выше первого. Особенную лепту в это вносят книги вводного или обзорного характера.
Ниже я привожу ряд вопросов с гипотетического собеседования по java concurrency, относящиеся как к первому так и ко второму уровню. Надеюсь кому-то они покажут направление, в котором возможно развиваться.
Как и на всяком собеседовании, не предполагается, что интервьюируемый ответит на все вопросы. Но предполагается, что опрашиваемый по-крайней мере ознакомлен с тематикой. Кроме того определение того 1) что кандидат знает; 2) о чем слышал; 3) о чем не слышал; позволяет составить о нем более полное мнение.

1. Назовите различия между Collections.synchronizedMap(new HashMap()) и ConcurrentHashMap.
2. Что такое кооперативная многозадачность и она ли ли в Java. Если да, то какие преимущества. Если нет, то какая тогда в Java?
3. Что такое "зеленый потоки" и они ли ли в Java (в HotSpot JVM.6)?
4. Различия в интерфейсах Runnable и Callable.
5. Напишите минимальный неблокирующий стек (всего два метода — push() и pop()).
6. Напишите минимальный copy-on-write ArrayList (всего четыре метода — void add(int indx, int item), int get(int indx), void remove(int indx), int size()).
7. Различя между Thread.isInterrupded() и Thread.interrupded().
8. Что происходит при вызове Thread.interrupt()?
9. Некоторые из следующих методов deprecated а некоторые и не были никогда реализованы. Какие? Thread.interrupt(), Thread.stop(), Thread.yield(), Thread.suspend(), Thread.resume(), Thread.join(), Thread.start(), Thread.run(), Thread.sleep().
10. Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?
11. Перечислите ВСЕ причины по которым может выскочить InterruptedException.
12. Что изменилось между JMM до Java 5 и NewJMM после Java 5?
13. В классе String все поля финальные. Можно ли убрать ключевое слово финал? Ведь сеттеров все равно нет — следовательно поля нельзя переустановить.
14. Что такое ordering, visibility, atomicity, happend-before, mutual exclusion. И показать на примерах volatile, AtomicInteger, synchronize{} — что из вышеперечисленного списка присутствует и при каких вариантах использования.
15. Назовите отличия synchronize{} и ReentrantLock.
16. Что из данных вызовов создает happend-before: Thread.sleep(), Thread.join(), Thread.yield(), Thread.start(), Thread.run(), Thread.isAlive(), Thread.getState()?
17. Перечислите известные Вам способы борьбы с priority inversion, назовите классы систем где они особенно опасны.
18. Перечислите известные Вам способы 1)избежать 2)побороть возникшие deadlock-и (представьте, что вы пишете ядро RDBMS).
19. Расскажите о паттернах Reactor/Proactor?
20. Что такое "monitor"?
21. Что такое "private mutex"?
22. Что такое "priority inheritance"?
23. Что такое "backoff protocol (expotential backoff)"?
24. Что такое "task stealing"?
25. Что такое "ABA problem"?
26. Что такое "test-end-set"?
27. Что такое "test-and-test-end-set"?
28. Что такое "spin lock"?
29. Что такое "sequential consistency"?
30. Что такое "sense-reversing barrier"?
31. Что такое "safe publication"?
32. Что это за свойство — "reentrancy"?
33. Что такое "recursive parallelism"?
34. Что такое "iterative parallelism"?
35. Что это за вариант архитектуры "pipeline"?
36. Что такое "poison message"?
37. Что такое "mutual exclusion"? Примеры как добиться в Java.
38. Что такое "condition waiting"? Примеры как добиться в Java.
39. Преимущества SheduledThreadPool перед java.util.Timer.
40. Различия между java.util.concurrent.Atomic*.compareAndSwap() и java.util.concurrent.Atomic*.weakCompareAndSwap().
41. Что в SynchronousQueue уникально для BlockingQueue.
42. Что такое "рандеву"? При помощи каких классов в Java его можно организовать?
43. Что такое "false sharing". Может ли происходит в Java. Если есть, то приведите примеры и как бороться. Если нет, то как побороли разработчики JVM.
44. Thread.getState() возвращает экземпляр Thread.State. Какие возможны значения?
45. Напишите простейший ограниченный буфер для многих производителей/многих потребителей с использованием synchronize{}. С использованием ReentrantLock.
46. У ReentrantLock созданного с аргументом true все же один из методов захвата блоктровки — не fair. Какой? Как это обойти?
47. Приведите наиболее существенное отличие между CountDownLatch и Barrier.
48. Что Вы знаете о Erlang? Что в нем есть существенного связанного с многопоточностью такого, чего нет в Java?
49. Что Вы знаете о CSP? Что в нем есть существенного связанного с многопоточностью такого, чего нет в Java?
50. Отличие Thread.start() и Thread.run()?
Re: Собеседование по Java Concurrency
От: Аноним  
Дата: 01.12.09 19:42
Оценка:
Очень интересный пост, спасибо !

многое из вопросов знакомо, многое нет.

Вы б не могли(раз уж начали эту тему) пойти до конца и написать короткие ответы на эти вопросы.
Я думаю это было б интересно многим и можно было б пойти дальше и разместить такую статью на RSDN.
Re: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 01.12.09 19:59
Оценка:
Здравствуйте, Golovach Ivan, Вы писали:

GI> Ниже я привожу ряд вопросов с гипотетического собеседования по java concurrency, относящиеся как к первому так и ко второму уровню. Надеюсь кому-то они покажут направление, в котором возможно развиваться.

Интересно, а если я могу ответить (подробно, с примерами) где-то на 40 вопросов — это много?

GI>27. Что такое "test-and-test-end-set"?

"Test And Test-And-Set"?

GI>49. Что Вы знаете о CSP? Что в нем есть существенного связанного с многопоточностью такого, чего нет в Java?

Тут точно CSP или всё-таки CPS?

Кстати, а где классический вопрос про double check singleton?
Sapienti sat!
Re[2]: Собеседование по Java Concurrency
От: C0s Россия  
Дата: 01.12.09 23:38
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Кстати, а где классический вопрос про double check singleton?


видимо, заключён где-то между 11-м и 13-м вопросами, по крайней мере, собеседующий, видя определённую продвинутость в ответе на 12 вопрос, может эту тему затронуть
Re[2]: Собеседование по Java Concurrency
От: Myra Россия  
Дата: 02.12.09 08:39
Оценка:
2Golovach Ivan:
+1 к Аноним.
Если вас не затруднит напиши ответ по паре предложений, на каждый вопрос.
Или хотя бы на вопросы, которые вы считаете более мудреными, чем остальные
Re[3]: Собеседование по Java Concurrency
От: MayB  
Дата: 02.12.09 08:56
Оценка:
Здравствуйте, Myra, Вы писали:

M>2Golovach Ivan:

M>+1 к Аноним.
M>Если вас не затруднит напиши ответ по паре предложений, на каждый вопрос.
M>Или хотя бы на вопросы, которые вы считаете более мудреными, чем остальные


2Golovach Ivan
Я присоединяюсь к коментам. Спасибо за пост, если не сложно очень хочется получить ответы.
Re: Собеседование по Java Concurrency
От: DrDred Россия  
Дата: 02.12.09 11:54
Оценка:
Здравствуйте, Golovach Ivan, Вы писали:

Большое спасибо, открылось огромное поле для размышлений.
У меня просьба как раз не давать ответов на вопросы Ибо не удержусь, прочту, а знания, легко полученные, также легко и уйдут, оставив ложное чувство спокойствия и уверенности в своих силах
--
WBR, Alexander
Re: Собеседование по Java Concurrency
От: Аноним  
Дата: 02.12.09 12:27
Оценка:
Спасибо, теперь я знаю что ничего не знаю
Подскажете, что имеет смысл читать, кроме java concurrency in practice? Понятно, что можно насобирать по кусочкам в инете, но есть ли что-то системное?
Re: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 02.12.09 12:49
Оценка: 19 (5)
Здравствуйте, Golovach Ivan, Вы писали:

Попробую поотвечать (насколько хватит времени):
GI>1. Назовите различия между Collections.synchronizedMap(new HashMap()) и ConcurrentHashMap.
В SynchronizedMap просто все операции синхронизированы, что не делает её полностью threadsafe. В частности, нужно явно делать синхронизацию при её обходе с помощью итераторов. Кроме того, блокировка требуется для всех методов — как читающих, так и мутирующих.

В ConcurrentHashMap _обычно_ используется модель many-readers one-writer, кроме того, её можно безопасно итерировать без синхронизации.

GI>2. Что такое кооперативная многозадачность и она ли ли в Java. Если да, то какие преимущества. Если нет, то какая тогда в Java?

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

В теории, кооперативная многопоточность может быть реализована в какой-нибудь JVM. Для передачи управления можно использовать Thread.yield(). Но я не знаю таких реализаций.

GI>3. Что такое "зеленый потоки" и они ли ли в Java (в HotSpot JVM.6)?

"Зелёные потоки" — это потоки, реализованные внутри самой JVM, а не на уровне ОС. Соответственно, их планированием занимается сама JVM, а не ОС. Это даёт немного более низкий overhead на переключение контекста, но может усложнять реализацию. Кроме того, проблематичной становится комбинация потоков ОС и "зелёных потоков".

В Sun JVM 1.6 их нет, хотя раньше они были реализованы для Solaris'а. Так же, они были в JRockit JVM.

GI>4. Различия в интерфейсах Runnable и Callable.

Метод call() в Callable может бросать исключение (объявлен как throws Exception). Метод run() в Runnable — нет.

GI>5. Напишите минимальный неблокирующий стек (всего два метода — push() и pop()).

Лень

GI>6. Напишите минимальный copy-on-write ArrayList (всего четыре метода — void add(int indx, int item), int get(int indx), void remove(int indx), int size()).

Лень

GI>7. Различя между Thread.isInterrupded() и Thread.interrupded().

Thread.interrupded() — статический метод, вызывающий Thread.isInterrupded() для текущего потока.

GI>8. Что происходит при вызове Thread.interrupt()?

У потока выставляется флаг "interrupted". В случае, если поток блокирован на interruptible-операции, то эта операция будет прервана, а в контекст потока заброшено InterruptedException.

GI>9. Некоторые из следующих методов deprecated а некоторые и не были никогда реализованы. Какие? Thread.interrupt(), Thread.stop(), Thread.yield(), Thread.suspend(), Thread.resume(), Thread.join(), Thread.start(), Thread.run(), Thread.sleep().

Thread.stop(), suspend() и resume() — deprecated, так как они небезопасны.

Thread.destroy() — никогда не был реализован.

Thread.run() — не надо вызывать, так как это выльется в обычный синхронный вызов потоковой функции, а не в запуск нового потока.

GI>10. Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?

Явного асинхронного вызова методов нет.

GI>50. Отличие Thread.start() и Thread.run()?

Thread.run() — не надо вызывать, так как это выльется в обычный синхронный вызов потоковой функции, а не в запуск нового потока. Стандартная ошибка, нужно использовать thread.start().

Из той же оперы — не надо наследовать свои классы от Thread(), особенно если в них есть метод setName()

Ухх... Могу дальше поотвечать на интересные вопросы.
Sapienti sat!
Re[2]: Собеседование по Java Concurrency
От: C0s Россия  
Дата: 02.12.09 13:07
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В ConcurrentHashMap _обычно_ используется модель many-readers one-writer, кроме того, её можно безопасно итерировать без синхронизации.


как бы, concurrent hash map можно вообще использовать без синхронизации (если только гранулярность атомарных операций того не требует, что, впрочем, отдельный разговор)

C>В теории, кооперативная многопоточность может быть реализована в какой-нибудь JVM. Для передачи управления можно использовать Thread.yield(). Но я не знаю таких реализаций.


возможно, более полный ответ затронет семантическую разницу между yield и sleep

C>В Sun JVM 1.6 их нет, хотя раньше они были реализованы для Solaris'а. Так же, они были в JRockit JVM.


спасибо, никогда особо не задумывался над этим, поэтому не знал, что их где-то реализовывали

GI>>4. Различия в интерфейсах Runnable и Callable.

C>Метод call() в Callable может бросать исключение (объявлен как throws Exception). Метод run() в Runnable — нет.

наверное, можно также коснуться истории, типа Runnable — старый интерфейс, прежде всего, для запуска потоков, а Callable — новый для использования в реализации concurrent-задач

GI>>5. Напишите минимальный неблокирующий стек (всего два метода — push() и pop()).

GI>>6. Напишите минимальный copy-on-write ArrayList (всего четыре метода — void add(int indx, int item), int get(int indx), void remove(int indx), int size()).
C>Лень

интересно, что эти вопросы подразумевают.
лично я с ходу не напишу, ибо не только лень, а ещё и лень запоминать наизусть лучшие практики из исходников java.util.concurrent.*.
если придётся что-то своё писать — я туда подсмотрю и сделаю, как надо, но запоминать — увольте.
в-общем, какие-то соревновательные вопросы

GI>>10. Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?

C>Явного асинхронного вызова методов нет.

надо бы упомянуть, что есть их поддержка на уровне стандартной библиотеки, Future там, Executors...
Re[2]: Собеседование по Java Concurrency
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 02.12.09 13:13
Оценка:
Здравствуйте, Cyberax, Вы писали:
GI>>4. Различия в интерфейсах Runnable и Callable.
C>Метод call() в Callable может бросать исключение (объявлен как throws Exception). Метод run() в Runnable — нет.

Возвращаемый результат — важнее.

GI>>7. Различя между Thread.isInterrupded() и Thread.interrupded().

C>Thread.interrupded() — статический метод, вызывающий Thread.isInterrupded() для текущего потока.

System.out.println(Thread.isInterrupded());
System.out.println(Thread.isInterrupded());
/... vs. .../
System.out.println(aThread.interrupded());
System.out.println(aThread.interrupded());

Будет ли различным результат обоих кусков, если aThread это текущая нить.

GI>>10. Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?

C>Явного асинхронного вызова методов нет.

Вопрос о Future?
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[3]: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 02.12.09 13:21
Оценка: +1
Здравствуйте, Andrei N.Sobchuck, Вы писали:

GI>>>4. Различия в интерфейсах Runnable и Callable.

C>>Метод call() в Callable может бросать исключение (объявлен как throws Exception). Метод run() в Runnable — нет.
ANS>Возвращаемый результат — важнее.
Да, забыл.

ANS>
ANS>System.out.println(Thread.isInterrupded());
ANS>System.out.println(Thread.isInterrupded());
ANS>/... vs. .../
ANS>System.out.println(aThread.interrupded());
ANS>System.out.println(aThread.interrupded());
ANS>

ANS>Будет ли различным результат обоих кусков, если aThread это текущая нить.
Будут, так как isInterrupted() без параметров не очищает флаг interrupted, а interupted() — очищает. Повбывав бы.

GI>>>10. Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?

C>>Явного асинхронного вызова методов нет.
ANS>Вопрос о Future?
Ага.
Sapienti sat!
Re[2]: Собеседование по Java Concurrency
От: Nicht Россия  
Дата: 02.12.09 13:26
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Golovach Ivan, Вы писали:


C>Попробую поотвечать (насколько хватит времени):

GI>>1. Назовите различия между Collections.synchronizedMap(new HashMap()) и ConcurrentHashMap.
C>В SynchronizedMap просто все операции синхронизированы, что не делает её полностью threadsafe. В частности, нужно явно делать синхронизацию при её обходе с помощью итераторов. Кроме того, блокировка требуется для всех методов — как читающих, так и мутирующих.

C>В ConcurrentHashMap _обычно_ используется модель many-readers one-writer, кроме того, её можно безопасно итерировать без синхронизации.


На счет one-writer не совем точно. Одновременных писателей может быть по числу сегментов в мапе. Параметризуется количество этих сегметов через аргумент concurencyLevel в конструкторе. По умолчанию 16.

GI>>7. Различя между Thread.isInterrupded() и Thread.interrupded().

C>Thread.interrupded() — статический метод, вызывающий Thread.isInterrupded() для текущего потока.

Опять же не совсе верно. Вызвается не Thread.isInterrupded() а Thread.isInterrupded(true). Что в общем то совсем другой метод. По сути возврядает текущее состояние интерапта и сбразывает его.
Re[3]: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 02.12.09 13:30
Оценка:
Здравствуйте, C0s, Вы писали:

C>>В ConcurrentHashMap _обычно_ используется модель many-readers one-writer, кроме того, её можно безопасно итерировать без синхронизации.

C0s>как бы, concurrent hash map можно вообще использовать без синхронизации (если только гранулярность атомарных операций того не требует, что, впрочем, отдельный разговор)
Ну так и synchronizedMap можно без синхронизации использовать, только её нельзя без синхронизации итерировать.

C>>В теории, кооперативная многопоточность может быть реализована в какой-нибудь JVM. Для передачи управления можно использовать Thread.yield(). Но я не знаю таких реализаций.

C0s>возможно, более полный ответ затронет семантическую разницу между yield и sleep
А в чём она? В некоторых ОС yield реализовывается как Sleep(0). Или то, что во время sleep() может прилететь InterruptedException?

C>>Метод call() в Callable может бросать исключение (объявлен как throws Exception). Метод run() в Runnable — нет.

C0s>наверное, можно также коснуться истории, типа Runnable — старый интерфейс, прежде всего, для запуска потоков, а Callable — новый для использования в реализации concurrent-задач
Ну да.

GI>>>5. Напишите минимальный неблокирующий стек (всего два метода — push() и pop()).

GI>>>6. Напишите минимальный copy-on-write ArrayList (всего четыре метода — void add(int indx, int item), int get(int indx), void remove(int indx), int size()).
C>>Лень
C0s>интересно, что эти вопросы подразумевают.
Написать простую реализацию. Там строк 50 получится. Для собеседования самое оно.

GI>>>10. Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?

C>>Явного асинхронного вызова методов нет.
C0s>надо бы упомянуть, что есть их поддержка на уровне стандартной библиотеки, Future там, Executors...
Да, это уже лень писать было. Ещё можно рассказать про то, как асинхронные методы в других языках сделаны.
Sapienti sat!
Re[3]: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 02.12.09 13:32
Оценка:
Здравствуйте, Nicht, Вы писали:

GI>>>7. Различя между Thread.isInterrupded() и Thread.interrupded().

C>>Thread.interrupded() — статический метод, вызывающий Thread.isInterrupded() для текущего потока.
N>Опять же не совсе верно. Вызвается не Thread.isInterrupded() а Thread.isInterrupded(true). Что в общем то совсем другой метод. По сути возврядает текущее состояние интерапта и сбразывает его.
Да, натыкался. За такой дизайн надо поубивать авторов этого интерфейса.
Sapienti sat!
Re[4]: Собеседование по Java Concurrency
От: C0s Россия  
Дата: 02.12.09 19:30
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>В теории, кооперативная многопоточность может быть реализована в какой-нибудь JVM. Для передачи управления можно использовать Thread.yield(). Но я не знаю таких реализаций.

C0s>>возможно, более полный ответ затронет семантическую разницу между yield и sleep
C>А в чём она? В некоторых ОС yield реализовывается как Sleep(0). Или то, что во время sleep() может прилететь InterruptedException?

считается, что yield останавливает нитку и помещает её в конец очереди выполняемых ниток.
с тем лишь замечанием, что эта очередь базируется на приоритетах.

предположим, нитка у нас озадачена чем-то типа

for (i = 0; i < до_хрена_и_больше; ++i) {
  // очередной цикл вычислений и никаких прерываний
  yield();
}


если я правильно понимаю, в вытесняющей многозадачности, треды с более низким приоритетом, всё-таки получат рано или поздно слоты для выполнения, пусть их будет пропорционально меньше,
а в кооперативной yield тредам с более низкими приоритетами ничего не даст — просто потому, что будет каждый раз оказываться в очереди впереди них.

напротив, в случае sleep(x) вместо yield() планировщик выполнения на x ms вообще должен изымать нитку из очереди, так что в описанной выше ситуации даже в кооперативной многопоточности треды с более низким приоритетом получат шанс.
Re[5]: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 03.12.09 02:43
Оценка:
Здравствуйте, C0s, Вы писали:

C0s>считается, что yield останавливает нитку и помещает её в конец очереди выполняемых ниток.

C0s>с тем лишь замечанием, что эта очередь базируется на приоритетах.
Нет, так как это зависит сугубо от планировщика. Типа, yield просто передаёт ему контроль. А дальше планировщик из приоритетов потоков и количества израсходованного ими времени уже решает кого запускать.
Sapienti sat!
Re[6]: Собеседование по Java Concurrency
От: C0s Россия  
Дата: 03.12.09 02:49
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C0s>>считается, что yield останавливает нитку и помещает её в конец очереди выполняемых ниток.

C0s>>с тем лишь замечанием, что эта очередь базируется на приоритетах.
C>Нет, так как это зависит сугубо от планировщика. Типа, yield просто передаёт ему контроль. А дальше планировщик из приоритетов потоков и количества израсходованного ими времени уже решает кого запускать.

полагаю, это не тот вопрос, на который можно дискутировать с применением "да" или "нет".
т.к. мы обсуждаем не работу планировщика, а то, как это видится со стороны java-кода. я всего лишь показал правдоподобную картину, в которой семантическая разница между yield и sleep будет, и ни javadoc, ни java spec ей не противоречат.
а тот факт, что планировщики бывают разными, а с вытесняющей многозадачностью мы вообще не сталкиваемся, на самом деле, к разговору имеет отдалённое отношение, ибо он сугубо теоретический.
Re[4]: Собеседование по Java Concurrency
От: Аноним  
Дата: 03.12.09 08:19
Оценка:
Здравствуйте, Cyberax, Вы писали:

ANS>>
ANS>>System.out.println(Thread.isInterrupded());
ANS>>System.out.println(Thread.isInterrupded());
ANS>>/... vs. .../
ANS>>System.out.println(aThread.interrupded());
ANS>>System.out.println(aThread.interrupded());
ANS>>

ANS>>Будет ли различным результат обоих кусков, если aThread это текущая нить.
C>Будут, так как isInterrupted() без параметров не очищает флаг interrupted, а interupted() — очищает. Повбывав бы.

Не будет. Все методы вернут false.

Вот так вот:

Thread.currentThread().interrupt();
System.out.println( Thread.currentThread().isInterrupted() );
System.out.println( Thread.currentThread().isInterrupted() );

System.out.println( Thread.interrupted() );
System.out.println( Thread.interrupted() );

вывод уже будет различаться, потому что interrupted() меняет состояние потока только в том случае, если поток до вызова этого метода был прерван.
Re[2]: Собеседование по Java Concurrency
От: remark Россия http://www.1024cores.net/
Дата: 03.12.09 09:59
Оценка: 8 (2)
Здравствуйте, Аноним, Вы писали:

А>Спасибо, теперь я знаю что ничего не знаю

А>Подскажете, что имеет смысл читать, кроме java concurrency in practice? Понятно, что можно насобирать по кусочкам в инете, но есть ли что-то системное?

Ответы на большинство вопросов можно найти в The Art of Multiprocessor Programming:
http://courses.csail.mit.edu/6.852/08/papers/lists-book-chapter.pdf

А так вообще это бумажная книга:
http://www.elsevier.com/wps/find/bookdescription.cws_home/714091/description#description


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.