Re[2]: Собеседование по Java Concurrency
От: -VladK-  
Дата: 03.12.09 10:49
Оценка:
Здравствуйте, Cyberax, Вы писали:

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

C>"Test And Test-And-Set"?

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


"Test And Test-And-Set" по сути и есть double check idiom.
Re[3]: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 03.12.09 10:50
Оценка:
Здравствуйте, -VladK-, Вы писали:

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

C>>"Test And Test-And-Set"?
C>>Кстати, а где классический вопрос про double check singleton?
VK>"Test And Test-And-Set" по сути и есть double check idiom.
Весь вопрос в барьерах
Sapienti sat!
Re[2]: Собеседование по Java Concurrency
От: ivanU  
Дата: 07.12.09 08:14
Оценка:
C>Из той же оперы — не надо наследовать свои классы от Thread(), особенно если в них есть метод setName()

А как лучше делать и почему?
Re[3]: Собеседование по Java Concurrency
От: Cyberax Марс  
Дата: 07.12.09 09:31
Оценка:
Здравствуйте, ivanU, Вы писали:

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

U>А как лучше делать и почему?
Реализовывать интерфейс Runnable и передавать параметром в конструктор Thread.
Sapienti sat!
Re: Собеседование по Java Concurrency
От: -VladK-  
Дата: 07.12.09 16:00
Оценка:
GI>5. Напишите минимальный неблокирующий стек (всего два метода — push() и pop()).

Что подразумевается под "неблокирующий", без synhronized и Lock-s?
Такой вариант приемлем?

class Stack<V>{
private AtomicReference<Node<V>> lastNodeRef = new AtomicReference<Node<V>>(new Node<V>());

void push(V v){
Node<V> newNode = new Node<V>();
newNode.elem=v;
boolean b;

do{
Node<V> lastNode = lastNodeRef.get();
newNode.prev=lastNode;
b = lastNodeRef.compareAndSet(lastNode, newNode);
}while (!b);
}
V pop(){
Node<V> lastNode;
boolean b;
do{
lastNode = lastNodeRef.get();
Node<V> prev = lastNode.prev;
if(prev==null){
return null;
}else
b = lastNodeRef.compareAndSet(lastNode, prev);
}while (!b);
return lastNode.elem;
}
private static class Node<V>{
V elem;
Node<V> prev;
}
}
Re[4]: Собеседование по Java Concurrency
От: ivanU  
Дата: 08.12.09 03:28
Оценка:
C>>>Из той же оперы — не надо наследовать свои классы от Thread(), особенно если в них есть метод setName()
U>>А как лучше делать и почему?
C>Реализовывать интерфейс Runnable и передавать параметром в конструктор Thread.

Извиняюсь за настырность, но чем такой вариант лучше?
До последнего времени использовал наследование от Thread, никаких подводных камней пока не попадалось.
Re[5]: Собеседование по Java Concurrency
От: Donz Россия http://donz-ru.livejournal.com
Дата: 08.12.09 08:46
Оценка: 2 (1)
Здравствуйте, ivanU, Вы писали:

C>>Реализовывать интерфейс Runnable и передавать параметром в конструктор Thread.

U>Извиняюсь за настырность, но чем такой вариант лучше?
U>До последнего времени использовал наследование от Thread, никаких подводных камней пока не попадалось.

Зачем наследоваться от полноценного класса, если ничего не собираешься использовать, кроме самописаного метода run? Меньше сущностей — больше порядка.
И уже было сказано, что ты можешь получить логическую ошибку (было про метод setName), если не проанализируешь поведение класса, от которого наследуешься.
Re[5]: Собеседование по Java Concurrency
От: remark Россия http://www.1024cores.net/
Дата: 08.12.09 09:05
Оценка: 23 (3) +2
Здравствуйте, ivanU, Вы писали:

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

U>>>А как лучше делать и почему?
C>>Реализовывать интерфейс Runnable и передавать параметром в конструктор Thread.

U>Извиняюсь за настырность, но чем такой вариант лучше?

U>До последнего времени использовал наследование от Thread, никаких подводных камней пока не попадалось.

В теории ООП считается, что включение порождает меньшую связанность, чем наследование; что в свою очередь благоприятно сказывается на сложности системы.
Например, если ты реализовал какую-то задачу как Runnable, то потом ты можешь запустить её в отдельном потоке с помощью Thread, или запустить её в пуле потоков Fork/Join с помощью ForkJoinTask, или передать в какую-либо другую стороннюю или свою библиотеку для асинхронного или даже синхронного выполнения. Если же ты жёстко отнаследовал от Thread, то ничего такого ты сделать не сможешь (по крайней мере без создания объектов Thread).
Ну и плюс, уже упомянутые, нежелательные коллизии имён.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Собеседование по Java Concurrency
От: Eugeny__ Украина  
Дата: 08.12.09 12:26
Оценка:
Здравствуйте, 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() — очищает. Повбывав бы.

Кстати, вечно путаю эту хрень. Согласен с "Повбывав бы" — всегда надо в документашку лезть.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[6]: Собеседование по Java Concurrency
От: ivanU  
Дата: 09.12.09 04:03
Оценка:
C>>>Реализовывать интерфейс Runnable и передавать параметром в конструктор Thread.

U>>Извиняюсь за настырность, но чем такой вариант лучше?

U>>До последнего времени использовал наследование от Thread, никаких подводных камней пока не попадалось.

R>В теории ООП считается, что включение порождает меньшую связанность, чем наследование; что в свою очередь благоприятно сказывается на сложности системы.

R>Например, если ты реализовал какую-то задачу как Runnable, то потом ты можешь запустить её в отдельном потоке с помощью Thread, или запустить её в пуле потоков Fork/Join с помощью ForkJoinTask, или передать в какую-либо другую стороннюю или свою библиотеку для асинхронного или даже синхронного выполнения. Если же ты жёстко отнаследовал от Thread, то ничего такого ты сделать не сможешь (по крайней мере без создания объектов Thread).
R>Ну и плюс, уже упомянутые, нежелательные коллизии имён.

Стало понятнее, благодарю

А что имелось в виду под "по крайней мере без создания объектов Thread" — как без его создания
я могу запустить свою Runnable задачу (без фреймворков, core java)?
Re[7]: Собеседование по Java Concurrency
От: chand0s  
Дата: 09.12.09 07:55
Оценка:
Здравствуйте, ivanU, Вы писали:

U>А что имелось в виду под "по крайней мере без создания объектов Thread" — как без его создания

U>я могу запустить свою Runnable задачу (без фреймворков, core java)?

yourRunnable.run()
Re[8]: Собеседование по Java Concurrency
От: ivanU  
Дата: 09.12.09 08:02
Оценка:
U>>А что имелось в виду под "по крайней мере без создания объектов Thread" — как без его создания
U>>я могу запустить свою Runnable задачу (без фреймворков, core java)?

C>
C>yourRunnable.run()
C>


сорри, забыл написать в прошлом посту — в отдельном потоке конечно — я правильно
понимаю, что без создания объекта Thread это невозможно (core java)?
Re[9]: Собеседование по Java Concurrency
От: Donz Россия http://donz-ru.livejournal.com
Дата: 09.12.09 08:40
Оценка:
Здравствуйте, ivanU, Вы писали:

U>сорри, забыл написать в прошлом посту — в отдельном потоке конечно — я правильно

U>понимаю, что без создания объекта Thread это невозможно (core java)?
Да.
Re[7]: Собеседование по Java Concurrency
От: remark Россия http://www.1024cores.net/
Дата: 09.12.09 08:53
Оценка:
Здравствуйте, ivanU, Вы писали:

U>А что имелось в виду под "по крайней мере без создания объектов Thread" — как без его создания

U>я могу запустить свою Runnable задачу (без фреймворков, core java)?

Я имел в виду следующую ситуацию. Допустим класс задачи всё-таки отнаследован от Thread, а мы хотим запустить эту задачу как Fork/Join Task.
Решение конечно не очень хорошее, но теоретически можно создать объект нашего класса, и он тоже будет реализовывать Runnable (т.к. Thread реализует Runnable), и потом из него создать Fork/Join Task. Это решение с созданием объектов Thread, без создания же объектов Thread из нашего класса не получится создать Fork/Join Task (это я имел в виду под "по крайней мере без создания объектов Thread").


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Собеседование по Java Concurrency
От: Golovach Ivan Украина http://kharkovitcourses.blogspot.com
Дата: 10.12.09 00:29
Оценка: 16 (4)
Я попробую в одном посте ответить на все замечания.
1) "написать короткие ответы на эти вопросы" — тут короткими ответами не отделаешься, выйдет десяток страниц.
2) "Интересно, а если я могу ответить (подробно, с примерами) где-то на 40 вопросов — это много?" — это только потенциальный работодатель может решить
3) "Test And Test-And-Set"? — да, так более корректно
4) "Тут точно CSP или всё-таки CPS?" — да, именно то хоаровское CSP==Communicating Sequential Processes являющееся скорее нотацией, а не реальным языком программирования. Немного провокационный. Знает ли интервьюируемый вообще про существование CSP, что знает, и если более-менее хорошо знает, то может ему в нем что-то особенно запомнилось/понравилось.
5) "Кстати, а где классический вопрос про double check singleton?" — скорее идиоматическим названием является double-checked locking [The "Double-Checked Locking is Broken" Declaration == http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html]. Если бы целью ставил всесторонние тесты — обязательно бы присутствовал, а так не хотелось вставлять уж слишком ожидаемый вопрос.
6) ""Test And Test-And-Set" по сути и есть double check idiom" — тут не могу согласиться. Скажем, у DCL в варианте из ссылки выше присутствует разбор полета конструктора в Java. какие-то параллели есть, но не тождество.
7) "Подскажете, что имеет смысл читать, кроме java concurrency in practice? Понятно, что можно насобирать по кусочкам в инете, но есть ли что-то системное?"
— Doug Lee. Concurrent Programming in Java. Design Principles and Patterns — Addison Wesley — 2nd edition
— The Art of Multiprocessor Programming (Maurice Herlihy, Nir Shavit)
— по алгоритмам: The little book of semaphores = http://www.greenteapress.com/semaphores/
— по структурам данных: "Concurrent Data Structures" = http://www.cs.tau.ac.il/~shanir/concurrent-data-structures.pdf
— по JMM возьмите отсюда — http://kharkovconcurrencygroup.blogspot.com/2009/09/jmm.html
— advanced JMM = очень полное и детальное описание модели памяти Java (Java Memory Model, JMM) с описанием целей, которые ставились при разработке, и компромиссных решений, которые приходилось принимать = http://unladen-swallow.googlecode.com/files/journal.pdf (thanks to Remark)
— это тусовка вообще всех товарищей из Java concurrency community = http://cs.oswego.edu/pipermail/concurrency-interest/

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

желательно знать что такая реализация есть в JDK = http://java.sun.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

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

Базовая статья = http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

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

Нет, рассказать как сделать на Future. Возможно интервьюируемый знает язык с реализацией.

GI>13. В классе String все поля финальные. Можно ли убрать ключевое слово финал? Ведь сеттеров все равно нет — следовательно поля нельзя переустановить.

Изменилась семантика ключевого слова final начиная с Java 5. Теперь просто убрать нельзя. Иначе при non safe publishing строка может вести себя как мутирующая (до Java 5 так могла себя вести и с final). = http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#finalWrong. "The original Java Memory Model allowed this behavior; several JVMs have exhibited this behavior. The new Java Memory Model makes this"

GI>16. Что из данных вызовов создает happend-before: Thread.sleep(), Thread.join(), Thread.yield(), Thread.start(), Thread.run(), Thread.isAlive(), Thread.getState()?

H-B: Thread.join(), Thread.start()

GI>21. Что такое "private mutex"?

http://c2.com/cgi/wiki?PrivateMutex

GI>38. Что такое "condition waiting"? Примеры как добиться в Java.

Ожидается просто рассказ про wait()/notify()-notifyAll() + j.u.c.lock.Condition

GI>41. Что в SynchronousQueue уникально для BlockingQueue.

То что нет размера.

GI>42. Что такое "рандеву"? При помощи каких классов в Java его можно организовать?

наиболее стандартно:
Передача в одну сторону — SynchronousQueue
Обмен — Exchanger

GI>43. Что такое "false sharing". Может ли происходит в Java. Если есть, то приведите примеры и как бороться. Если нет, то как побороли разработчики JVM.

— может
— из спеки не следует что массивы и поля объекта расположены в непрерывной области памяти(нет адресной арифметики), но обычно так и есть.
— просто интересные мысли
-- зачастую память в потоке выделяется из thread local buffer — и это немного уменьшает ложное разделение. Плюс перемещающий GC (copy-, compact- , etc) может объекты принадлежащие одному потоку расположить рядом (но тут не знаю вышли ли такие разработки за пределы лабораторий).

GI>44. Thread.getState() возвращает экземпляр Thread.State. Какие возможны значения?

Собственно попытка подловить (в том числе) на понимании разницы между Thread.State.WAITING и Thread.State.BLOCKING.

GI>46. У ReentrantLock созданного с аргументом true все же один из методов захвата блоктровки — не fair. Какой? Как это обойти?

.tryLock(), "If you want to honor the fairness setting for this lock, then use tryLock(0, TimeUnit.SECONDS) which is almost equivalent (it also detects interruption)."

GI>47. Приведите наиболее существенное отличие между CountDownLatch и Barrier.

Ожидаемый ответ — CyclicBarrier(извинения за описку) — "многоразовый", а CountDownLatch — "одноразовый".

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

Ожидаемое начало ответа — легковесные потоки. Но тут зависит насколько соискатель знает Erlang
Re[2]: Собеседование по Java Concurrency
От: remark Россия http://www.1024cores.net/
Дата: 10.12.09 15:34
Оценка:
Здравствуйте, Аноним, Вы писали:

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

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

Ещё есть "Concurrent Programming in Java(TM): Design Principles and Pattern" от Doug Lea:
http://www.amazon.com/Concurrent-Programming-Java-TM-Principles/dp/0201310090

Вот тут есть хороший список книг по concurrency/parallelism:
http://software.intel.com/en-us/articles/technical-books-for-multi-core-software-developers
Язык тут практически не имеет значения, т.к. все принципы, приёмы и паттерны совершенно одинаковые, а какой синтаксис той или иной функции — это и в хелпе посмотреть можно.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Собеседование по Java Concurrency
От: chand0s  
Дата: 13.12.09 12:57
Оценка:
Здравствуйте, remark, Вы писали:

R>Ещё есть "Concurrent Programming in Java(TM): Design Principles and Pattern" от Doug Lea:

R>http://www.amazon.com/Concurrent-Programming-Java-TM-Principles/dp/0201310090

У меня в голове крутится, что книга Java. Concurrency in Practice является как бы следующим изданием, "переработанным и дополненным" к той, что Вы упоминаете. Это действительно так, или книги совершенно разные и читать надо обе?
Re[3]: Собеседование по Java Concurrency
От: techgl  
Дата: 13.12.09 13:32
Оценка:
Здравствуйте, remark, Вы писали:

R>А так вообще это бумажная книга:

R>http://www.elsevier.com/wps/find/bookdescription.cws_home/714091/description#description
Достаточно дорогая книга, эл. вариант почти за 60 евро. Оно того стоит?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Собеседование по Java Concurrency
От: Аноним  
Дата: 16.12.09 13:46
Оценка:
Здравствуйте, techgl, Вы писали:

T>Достаточно дорогая книга, эл. вариант почти за 60 евро. Оно того стоит?


Сейчас читаю электронную версию, есть интересные моменты. По характеру изложения более академическая чем Java Concurrency in Practice.
Re[4]: Собеседование по Java Concurrency
От: remark Россия http://www.1024cores.net/
Дата: 16.12.09 14:16
Оценка:
Здравствуйте, techgl, Вы писали:

T>Здравствуйте, remark, Вы писали:


R>>А так вообще это бумажная книга:

R>>http://www.elsevier.com/wps/find/bookdescription.cws_home/714091/description#description
T>Достаточно дорогая книга, эл. вариант почти за 60 евро. Оно того стоит?

Это единственная книга по неблокирующим алгоритмам синхронизации.


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