100+ вопросов на собеседование по Java Concurrency

от автора

В рамках подготовки к чтению курса «Multicore programming in Java» собрал небольшую подборку вопросов. Возможно кому-то она будет полезна.

Общие вопросы

— В чем разница между потоком и процессом?
— Что такое кооперативная многозадачность и она ли в Java. Если да, то какие преимущества. Если нет, то какая тогда в Java?
— Сравните кооперативную и вытесняющую многозадачности.
— Что такое «зеленый потоки» и они ли в Java (в HotSpot JVM 7)?
— Когда началась «Multicore Era»?
— Что такое — Планировщик потоков? Предположите алгоритм работы.
— Какие выигрыши может дать многопоточность на одноядерной машине?

«Железо»

— Что такое Flynn’s taxonomy, SISD/MISD/SIMD/MIMD? К какому классу относятся CPU? GPU?
— Расскажите про иерархию кэшей L1/L2/L3? Что вызвало ее появление?
— Что такое Memory wall?
— Что такое Memory Hierarchy?
— Что такое Cache line? В виде каких эффектов проявляется?
— Что такое False sharing? Плохо это или хорошо? Как с этим бороться?
— Что такое Memory padding?
— Что такое Cache pollution? Плохо это или хорошо? Как с этим бороться?
— Что такое Cache miss? Плохо это или хорошо? Как с этим бороться?
— В чем разница между SMP и NUMA? Как это сказывается на программах?
— В чем разница между Multicore и Multisocket?
— Что такое Thread affinity? Можно ли сделать в Java?
— Что такое Inter Thread Parallelism? Task Parallelism?
— Что такое Branch Prediction?
— Что такое Speculative Execution?
— Сравните с точки зрения программиста — машину с четырехядерным процессором и двумя двухядерными процессорами.
— Напишите программу, которая демонстрирует False sharing.
— Напишите программу, которая демонстрирует размер кэша L1.
— Напишите программу, которая демонстрирует размер кэша L2.

Java Memory Model

— Что такое частичный порядок?
— Что такое отношение happens-before?
— Почему happens-before — это частичный порядок?
— Что такое data-race?
— Какие гарантии на работу с volatile?
— Какие гарантии на работу с final?
— Вычисление hashCode у java.lang.String имеет data race — Вас это не пугает?
— Объясните смысл выражения «data race free программа является sequential consistent».
— В классе String все поля финальные. Можно ли убрать ключевое слово финал? Ведь сеттеров все равно нет — следовательно поля нельзя переустановить.
— Что такое ordering, visibility, atomicity, happend-before, mutual exclusion на примере volatile.
— Что такое ordering, visibility, atomicity, happend-before, mutual exclusion на примере synchronize.
— Что такое ordering, visibility, atomicity, happend-before, mutual exclusion на примере AtomicInteger.
— атомарно ли ++ для volatile переменной?

Базовое API, примитивы/конструкции

— Thread.getState() возвращает экземпляр Thread.State. Какие возможны значения?
— Отличие Thread.start() и Thread.run()?
— Что происходит при вызове Thread.interrupt()?
— Что происходит при вызове Thread.stop()?
— Почему Thread.stop()/destroy()/suspend()/resume() — deprecated?
— Перечислите все причины по которым может выскочить InterruptedException.
— Что из данных вызовов создает happend-before: Thread.sleep(), Thread.join(), Thread.yield(), Thread.start(), Thread.run(), Thread.isAlive(), Thread.getState()?
— В чем разница между Thread.sleep() и Thread.yeild()?
— В чем проблема с Double Checked Locking? Как все-таки сделать потокозащищенный ленивый синглетон с дешевым доступом?
— Что такое Safe Publishing?
— Как сделать Safe Publishing используя volatile?
— Как сделать Safe Publishing используя synchronized?
— Как сделать Safe Publishing используя AtomicBoolean?
— Что такое Монитор?
— Расскажите о взаимодействии synchronized/Object.wait()/.notify()/.notifyAll()?
— Реализуйте ограниченную блокирующую очередь на synchronized/Object.wait()/.notify()/.notifyAll()
— Перечислите все сценарии попадания в blocking-set встроенного монитора
— Перечислите все сценарии выхода из blocking-set встроенного монитора
— Перечислите все сценарии попадания в wait-set встроенного монитора
— Перечислите все сценарии выхода из wait-set встроенного монитора
— Различия между Thread.isInterrupded() и Thread.interrupded().
— Расскажите о идиоме многопоточного проектирования Private mutex.
— Расскажите о идиоме многопоточного проектирования Spin lock/Busy waiting.
— Расскажите о идиоме многопоточного проектирования backoff protocol (expotential backoff).
— Что это за свойство — «reentrancy»?
— Что такое «poison message»?
— Что такое «mutual exclusion»? Примеры как добиться в Java.
— Что такое «condition waiting»? Примеры как добиться в Java.

java.util.concurrent: Пулы потоков, Future

— Различия в интерфейсах Runnable и Callable.
— Преимущества SheduledThreadPool перед java.util.Timer.
— Говорят, что Future/CompletableFuture — это монада. Что скажете?
— В чем преимущество ForkJoinPool над ThreadPoolExecutor?
— Какая функциональность появилась у SheduledThreadPool в сравнении с ThreadPoolExecutor?
— В чем отличие методов sheduleAtFixedRate() от sheduleAtFixedDelay() класса SheduledThreadPool?
— Реализуйте простейший пул потоков фиксированного размера.

java.util.concurrent: Многопоточные коллекции

— Расскажите о шаблоне многопоточного проектирования Producer/Consumer.
— Расскажите о шаблоне многопоточного проектирования Master/Workers.
— Расскажите о шаблоне многопоточного проектирования Pipes-and-Filters, SEDA.
— Что в SynchronousQueue уникально для BlockingQueue.
— Что такое «рандеву»? При помощи каких классов в Java его можно организовать?
— Почему TransferQueue НЕ BlockingQueue?
— Есть ли какие-то happens-before гарантии при работе с BlockingQueue? Между двумя put()? Между put() и take()? Между двумя take()?
— Есть ли какие-то happens-before гарантии при работе с ConcurrentMap? Между двумя put()? Между put() и get()? Между двумя get()?
— В чем отличия Collections.synchronizedMap(new HashMap()) от new ConcurrentHashMap()?
— Интерфейс ConcurrentMap — наследник интерфейса Map, однако там добавлены новые методы. Какие?
— Как реализован CopyOnWriteList? В чем преимущества/недостатки в сравнении с Collections.synchronizedList(new ArrayList())?

java.util.concurrent: «Синхронизаторы»

— Расскажите о API класса CountDownLatch и возможный сценарий использования.
— Расскажите о API класса CyclicBarrier и возможный сценарий использования.
— Расскажите о API класса Semaphore и возможный сценарий использования.
— Реализуйте свой вариант CountDownLatch используя Semaphore.
— Реализуйте свой вариант CyclicBarrier используя Semaphore.
— Реализуйте свой вариант монитора используя Semaphore.
— В чем отличия CountDownLatch от CyclicBarrier?
— Назовите отличия synchronize{} и ReentrantLock.
— Что может Phaser?

Fork/Join Framework (Java 7)

— Расскажите о модели рекурсивного параллелизма в сравнении с итеративным параллелизмом.
— Что такое Task stealing?

Parallel Streams (Java 8)

— Объясните, что такое Internal iteration и External iteration.
— Как соотносятся свойства Stream-ов (immediate/terminal, lazy/eager, short-circuiting, ordered/unordered) с возможностью автоматического распараллеливания?
— Как согласовать упорядоченность Stream-ов и возможность параллельной обработки элементов (filter, map, flatMap)?
— Опишите как происходит параллельный reduce, если потоков много, а результат один?
— Опишите как происходит параллельный collect, если потоков много, а результат один?

Неблокирующий алгоритмы

— В чем состоит критика архитектур с явным использованием потоков и блокировок с позиции неблокирующих алгоритмов?
— Дайте определение и сравните Wait-freedom, Lock-freedom и Obstruction-freedom.
— Объясните какие happens-before ребра образуются при работе с AtomicXYZ классами.
— Реализуйте стек Трейбера.
— Что такое ABA-проблема?
— Как AtomicMarkableReference решает ABA-проблему?
— Зачем нам AtomicIntegerArray если мы можем использовать AtomicInteger[]?
— Зачем используется AtomicFieldUpdater если у нас есть AtomicReference?
— Различия между java.util.concurrent.Atomic*.compareAndSwap() и java.util.concurrent.Atomic*.weakCompareAndSwap().

Архитектуры на основе передачи сообщений

— Расскажите о противопоставлении архитектур на основе Mesage Passing и Shared Memory. В чем сильные и слабые стороны каждого из подходов?
— Если акторы обмениваются сообщениями, а сообщения — это данные, то как решается проблема одновременного доступа к данным разными потоками?
— Говорят, что акторы — это легковесные потоки и их можно создавать десятки и сотни тысяч. Как это реализуется на JVM?
— Чем «занят» актор, когда нет входящих сообщений?

Software Transactional Memory (?)

— В чем суть архитектуры STM?
— Какие преимущества STM над явным использованием блокировок?
— Какие недостатки STM над явным использованием блокировок?

Persistent Data Structures

— В чем суть Persistent Data Structures?
— Какие плюсы и минусы у Persistent Data Structures перед «классическими» структурами?
— В чем различия между partially persistent, fully persistent и confluently persistent?
— Реализуйте персистентный стек. К какому классу он относится (partially persistent, fully persistent или confluently persistent)?
— Нарисуйте, как бы вы реализовывали Persistent Tree Map.

Контакты

Кратко о курсе «Multicore programming in Java»: стартует 1 сентября, ведется в режиме вебинаров дважды в неделю (понедельник + четверг) в 19.00-22.00 (по московскому времени), состоит из 16 лекций по 2.5 часа (=40 лекционных часов), рассчитан на Java Middle.

Стоимость курса
— при оплате до 9 августа — 375$
— при оплате до 16 августа — 400$
— при оплате до 23 августа — 425$
— при оплате до 30 августа — 450$

Приходите ко мне на курс. Учить многопоточность веселее с единомышленниками!

Я занимаюсь онлайн обучением Java. Видеозаписи лекций в аудитории Вы можете увидеть на youtube-канале, возможно, видео канала лучше систематизировано в этой статье.

На все вопросы с удовольствием отвечу по следующим контактам (или в комментариях)
skype: GolovachCourses
email: GolovachCourses@gmail.com

ссылка на оригинал статьи http://habrahabr.ru/post/231633/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *