Ниже приведены популярные вопросы интервью, связанные с Java Threads, которые вы можете использовать для подготовки к собеседованию.
1) Что такое поток?
Поток - это самый маленький блок, который операционная система может выполнять операции и планирование. Он содержится в процессе и является фактическим рабочим блоком в процессе. Программисты могут запрограммировать многопроцессорные услуги через него, и вы можете ускорить задачи интенсивных работ с использованием многопоточного чтения. Например, если для выполнения поток требуется 100 миллисекунд, чтобы выполнить задачу, для выполнения потока требуется всего 10 миллисекунд, чтобы выполнить изменение задачи, используя десять потоков. Java обеспечивает отличную поддержку для многопоточного чтения на языковом уровне, и это также хорошая торговая точка. Для получения более подробной информации, пожалуйста, нажмите здесь.
2) В чем разница между потоком и процессом?
Потоки являются подмножествами процессов. Процесс может иметь много потоков, и каждый поток выполняет разные задачи параллельно. Различные процессы используют разные пространства памяти, в то время как все потоки имеют одно и то же пространство памяти. Не связывайте его с памятью стека, в каждом потоке есть отдельная память стека для хранения локальных данных. Для получения более подробной информации, пожалуйста, нажмите здесь.
3) Как реализовать потоки в Java?
На языковом уровне есть два способа. Экземпляр класса java.lang.thread - это поток, но он должен вызвать интерфейс java.lang.runnable для выполнения. Поскольку сам класс потока является подзаненным интерфейсом, вы можете унаследовать класс java.lang.thread или напрямую вызову интерфейс «Запустить», чтобы переопределить метод run () для реализации потока. Для получения более подробной информации, пожалуйста, нажмите здесь.
4) Используйте запустить или поток?
Этот вопрос является продолжением предыдущего вопроса. Все знают, что мы можем реализовать потоки, унаследовав класс потоков или вызывая запускаемый интерфейс. Вопрос в том, какой метод лучше? При каких обстоятельствах я должен его использовать? На этот вопрос легко ответить, если вы знаете, что Java не поддерживает множественное наследство классов, но позволяет вам вызывать несколько интерфейсов. Поэтому, если вы хотите унаследовать другие классы, конечно, лучше вызвать запускаемый интерфейс. Для получения более подробной информации, пожалуйста, нажмите здесь.
6) В чем разница между методами start () и run () в классе потока?
Этот вопрос часто задают, но он все еще может отличить понимание интервьюера от модели потока Java от этого. Метод start () используется для запуска вновь созданного потока, а метод run () называется внутренне, что отличается от эффекта непосредственного вызова метода run (). Когда вы называете метод run (), он будет вызван только в исходном потоке. Если нет нового потока, метод start () запустит новый поток. Для получения дополнительных обсуждений, пожалуйста, нажмите здесь
7) В чем разница между беглевой и вызовой в Java?
Обе запускаемые и призываемые представляют задачи, которые выполняются в разных потоках. Runnable был доступен с JDK1.0, а Callable был добавлен в JDK1.5. Их основное отличие состоит в том, что метод Call () Callable может возвращать значения и бросить исключения, в то время как метод run () runnable не имеет этих функций. Callible может вернуть будущий объект, загруженный результатами расчета. Мой блог имеет более подробные инструкции.
8) В чем разница между Cyclicbarrier и Countdownlatch в Java?
Как Cyclicbarrier, так и Countdownlatch могут быть использованы, чтобы группа потоков ждала других потоков. В отличие от Cyclicbarrier, Countdownlatch не может быть использован повторно. Нажмите здесь, чтобы увидеть больше информации и пример кода.
9) Что такое модель памяти Java?
Модель памяти Java определяет и направляет программы Java, чтобы вести себя детерминированно между различными архитектурами памяти, процессорами и операционными системами. Это особенно важно в многопоточных ситуациях. Модель памяти Java может гарантировать, что изменения, внесенные одним потоком, видны для других потоков, а отношения происходят в первую очередь. Эти отношения определяют некоторые правила, чтобы сделать программистов более ясными в их параллельном программировании. Например, в первую очередь наличие отношений гарантирует:
Код в потоках может быть выполнен в последовательности, которая называется Правилами заказа программы.
Для той же блокировки должны происходить операция разблокировки перед другой операцией блокировки, которая происходит во времени, которая также называется правилом блокировки управления.
Предыдущая операция записи в летучую - перед следующей операцией чтения летучих, которое также называется правилом летучей переменной.
Любая операция в потоке должна быть вызвана после начала () этого потока, также известной как правило начала потока.
Все операции потока будут прекращены до завершения потока.
Операция завершения объекта должна быть после построения объекта, которое также называется правилом завершения объекта.
Транзитив
Я настоятельно рекомендую вам прочитать главу 16 «Практика программирования параллельного параллера Java», чтобы углубить ваше понимание модели памяти Java.
10) Какова нестабильная переменная в Java?
volatile - это специальный модификатор, который может использоваться только с переменными члена. В случае, когда в однопольном в Java -одновременных программах не хватает синхронных классов, операции по многопоточному чтению по переменным членам прозрачны для других потоков. Платальная переменная может гарантировать, что следующая операция чтения будет проходить после предыдущей операции записи, которая является правилом летучей переменной предыдущего вопроса. Нажмите здесь, чтобы увидеть более нестабильный контент.
11) Что такое безопасность потока? Vector-это безопасный класс потока? (См. Здесь для деталей)
Если ваш код находится в процессе, в котором вы находитесь, одновременно работает несколько потоков, и эти потоки могут одновременно запускать этот код. Если результат каждого прогона совпадает с результатом запуска одного потока, а значения других переменных одинаковы, как и ожидалось, он безопасен для потока. Один и тот же объект экземпляра класса Safe-Safe Counter не будет вызывать ошибки расчета при использовании нескольких потоками. Очевидно, что вы можете разделить класс коллекции на две группы: потоковые и не-трюки-безопасные. Vector использует методы синхронизации для достижения безопасности потока, в то время как ArrayList аналогично ему не безопасен.
12) Какие условия гонки в Java? Привести пример.
Условия гонки приведут к возникновению некоторых ошибок в одновременных ситуациях программы. Когда многопоточности конкурируют за некоторые ресурсы, возникнут условия гонки. Если первая программа, которая будет выполнена, не выполняется и позже выполнена, некоторые неопределенные ошибки появятся во всей программе. Такие ошибки трудно обнаружить и повторить из -за случайной конкуренции между потоками. Примером является беспорядочная обработка, см. Ответ для деталей.
13) Как остановить нить на Java?
Java обеспечивает богатый API, но не предоставляет API для остановки потоков. Первоначально JDK 1.0 имел некоторые методы контроля, такие как STOP (), SUSPEND () и RESUME (), но из -за потенциальных угроз тупика они были устарели в последующих версиях JDK. После этого дизайнер Java API не предоставил совместимый и безопасный способ остановить нить. Когда выполняется метод run () или call (), поток автоматически закончится. Если вы хотите завершить потоки вручную, вы можете использовать летучую логическую переменную для выхода из цикла метода run () или отменить задачу, чтобы прервать поток. Нажмите здесь, чтобы просмотреть пример кода.
14) Что происходит, когда происходит исключение при запуске потока?
Это очень сложный вопрос на интервью на Java, с которым я столкнулся в интервью. Проще говоря, если исключение не поймано, поток перестанет выполнять.
Thread.uncaughtexceptionHandler - это встроенный интерфейс для обработки uncaught исключения, которые вызывают внезапное прерывание потока. Когда Uncaught Exception приводит к прерыванию потока, JVM будет использовать Thread.getuncaughtexceptionHandler () для запроса uncateXceptionHandler потока и передать поток и исключение в качестве параметров методу unctexception () обработки.
15) Как поделиться данными между двумя потоками?
Вы можете сделать это, поделившись объектами или используя параллельные структуры данных, такие как блокировка очередей. В этом учебном пособии «Java Inter-Thread Communication» (которое включает в себя обмен объектами между двумя потоками) использует методы ожидания и уведомление для реализации модели потребительского производителя.
16) В чем разница между уведомлением и уведомлением в Java?
Это еще одна сложная проблема, потому что многопоточная чтение может ждать однопользовательских замков, а дизайнеры Java API предоставляют некоторые способы уведомить их при ожидании изменений условий, но эти методы не полностью реализованы. Метод notify () не может разбудить конкретный поток, поэтому он будет работать только тогда, когда один поток ждет. И notifyall () разбудит все потоки и позволяет им конкурировать за замки, чтобы гарантировать, что хотя бы один поток мог продолжать работать. Мой блог имеет более подробную информацию и пример кода.
17) Почему ожидание, уведомление и уведомление методов не в классе потоков?
Это вопрос, связанный с дизайном, который исследует восприятие интервьюером существующих систем и то, что является общим, но кажется необоснованным. Отвечая на эти вопросы, вам нужно объяснить, почему имеет смысл поместить эти методы в класс объектов, и почему бы не поместить их в класс потока. Одна из очевидных причин заключается в том, что замки, предоставленные Java, имеют на уровне объекта, а не на уровне потока, и у каждого объекта есть блокировка, полученная через потоки. Если поток должен ждать некоторых замков, имеет смысл вызвать метод wait () в объекте. Если метод wait () определен в классе потока, не будет очевидно, какая блокировка ждет поток. Проще говоря, поскольку ожидание, уведомление и уведомление-это операции на уровне блокировки, они определены в классе объекта, потому что блокировка принадлежит объекту. Вы также можете проверить эту статью, чтобы узнать больше.
18) Что такое потоковая переменная?
Threadlocal является специальной переменной в Java. Каждый поток имеет нитолокальный, что означает, что каждый поток имеет свою собственную независимую переменную, и условия гонки полностью устраняются. Это отличный способ получить безопасность потока для создания дорогих объектов. Например, вы можете использовать Threadlocal для того, чтобы сделать SimpleDateFormat-защитный, потому что этот класс дорогой для создания и требует создания другого экземпляра для каждого вызова, поэтому он не стоит использовать его локально. Если вы предоставите каждому потоку уникальную копию переменных, это значительно повысит эффективность. Во -первых, количество созданных объектов уменьшается путем мультиплексирования. Во -вторых, вы получаете безопасность потока без использования дорогостоящей синхронизации или инвариантности. Другим хорошим примером локальных переменных потока является класс Threadlocalrandom, который уменьшает количество дорогих случайных объектов, созданных в многопоточной среде. Смотрите ответы, чтобы узнать больше.
19) Что такое FutureTask?
В программе Java, одновременной, FutureTask представляет собой асинхронную операцию, которая может быть отменена. Он имеет такие методы, как начало и отмену операций, запрашивая, завершены ли операции и получение результатов работы. Результат может быть получен только после завершения операции. Если операция не завершена, метод GET будет блокировать. Объект FutureTask может обернуть объекты, которые вызывают вызов и запускаемые. Поскольку FutureTask также вызывает запускаемый интерфейс, его можно отправить исполнителю для выполнения.
20) В чем разница между прерванными и межпогрейскими методами в Java?
Основное различие между прерванным () и ISERENTRUPTED () заключается в том, что первое очистит состояние прерывания, а последняя - нет. Механизм прерывания многопоточного чтения Java реализуется с внутренними идентификаторами. Вызов Thread.Intertrupt () для прерывания потока установит идентификатор прерывания на TRUE. Когда поток прерывания вызывает поток статического метода. Interrupted () для проверки состояния прерывания, состояние прерывания будет очищено. Нестатический метод ISERESSTED () используется для запроса состояния прерывания других потоков без изменения идентификатора статуса прерывания. Проще говоря, любой метод, который бросает прерывавшее, прояснит состояние прерывания. В любом случае, состояние прерывания потока может быть изменено другими потоками вызова прерываний.
21) Почему методы ожидания и уведомления должны быть вызваны в синхронном блоке?
Это происходит главным образом потому, что Java API вызывает это, а если вы этого не сделаете, ваш код вызовет исключение allodalmonitorstateException. Другая причина состоит в том, чтобы избежать условий гонки между ожиданием и уведомлением.
22) Почему вы должны проверять условия ожидания в цикле?
Потоки в состоянии ожидания могут получать оповещения о ошибках и псевдо-пробеги. Если условие ожидания не проверяется в цикле, программа выйдет без выполнения конечного условия. Следовательно, когда резьба ожидания просыпается, нельзя рассмотреть, что его первоначальное состояние ожидания все еще действует, и он может измениться в течение этого периода после вызова метода notify () и до того, как поток ожидания разбудит. Вот почему использование метода wait () в цикле работает лучше, вы можете создавать шаблоны в Eclipse, чтобы позвонить и уведомлять и попробовать. Если вы хотите узнать больше об этой проблеме, я рекомендую вам прочитать главы поток и синхронизации в книге «Эффективная Java».
23) В чем разница между синхронными коллекциями и одновременными коллекциями в Java?
Как синхронные коллекции, так и одновременные коллекции обеспечивают подходящие сборы для защиты потоков для многопоточного чтения и параллелизма, но одновременные коллекции более масштабируемы. Перед Java 1.5 программисты использовали только синхронные коллекции, и когда вкладывалось многопоточное параллелизм, это приведет к споры, препятствуя масштабируемости системы. Java5 представляет параллельные коллекции, такие как ConcurrenthashMap, который не только обеспечивает безопасность потоков, но и улучшает масштабируемость с помощью современных технологий, таких как разделение блокировки и внутренние зоны. Смотрите ответ для более подробной информации.
24) В чем разница между кучей и стеком в Java?
Почему этот вопрос классифицируется по многопоточным и параллельным вопросам интервью? Потому что стек - это область памяти, тесно связанная с потоком. Каждый поток имеет свою собственную память стека, которая используется для хранения локальных переменных, параметров метода и вызовов стека. Переменные, хранящиеся в одном потоке, невидимы для других потоков. Куча - это общая область памяти, разделяемая всеми потоками. Объекты создаются в куче. Чтобы повысить эффективность, поток будет кэшировать от кучи до своего стека. Если несколько потоков используют эту переменную, это может вызвать проблемы. В настоящее время летучая переменная может сыграть роль, которая требует, чтобы поток считывал значение переменной из основной памяти.
Смотрите ответ для более подробной информации.
25) Что такое бассейн потоков? Зачем его использовать?
Создание потоков занимает дорогие ресурсы и время. Если поток создается только после того, как задача появится, время отклика станет длиннее, а процесс может создать ограниченное количество потоков. Чтобы избежать этих проблем, несколько потоков создаются для реагирования и процесса, когда программа запускается. Они называются пулами потоков, а потоки внутри называются рабочими потоками. Начиная с JDK1.5, Java API предоставляет структуру исполнителя, которая позволяет создавать различные пулы потоков. Например, один пул потоков, который выполняет одну задачу за раз; Фиксированное количество пулов резьбов или пулов кеша (расширяемый пул потоков, подходящий для многих программ с недолговечными задачами). Смотрите эту статью для получения более подробной информации.
26) Как написать код для решения проблем производителя и потребителей?
В действительности, многие из проблем, которые вы решаете, относятся к модели потребительской модели производителя, которая заключается в том, что одна задача по производству потока предназначена для потребления другими потоками. Вы должны знать, как общаться между потоками, чтобы решить эту проблему. Относительно низкоуровневый метод состоит в том, чтобы использовать ожидание и уведомление для решения этой проблемы. Более отличным методом является использование семафора или блокировки для реализации модели производителя и потребителей. Этот урок реализует это.
27) Как избежать тупиков?
Тупик в Java MultiThreading
Deadlock относится к явлению взаимного ожидания, вызванного двумя или более процессами в процессе выполнения из -за конкуренции за ресурсы. Без внешних сил они не смогут продолжить. Это серьезная проблема, потому что тупики заставят вашу программу приостановить и неспособную выполнить задачу. Следующие четыре условия должны быть выполнены для возникновения тупиков:
Условие взаимного исключения: ресурс может использоваться только одним процессом за раз.
Запрос и условия удержания: когда процесс блокирует из -за запроса ресурсов, он сохраняет приобретенные ресурсы.
Условия не лишения: ресурсы, полученные процессом, не могут быть насильственно лишены до конца использования.
Условия ожидания цикла: между несколькими процессами, которые связаны с головой и хвостом, формируется отношение ресурса с ожиданием петли.
Самый простой способ избежать тупиков - это предотвратить условия ожидания в циклах, установить флаги и сортировать все ресурсы в системе, а также предусматривать, что все ресурсы применения процесса должны работать в определенном порядке (восходящее или убыточное приказ), чтобы избежать тупиков. В этом учебном пособии есть примеры кода и подробности обсуждения об избежании тупиков.
28) В чем разница между живыми замками и тупиками на Яве?
Это расширение предыдущего вопроса. Живые замки похожи на тупики. Разница в том, что состояние потока или процесса в живом блоке постоянно меняется. Живые замки можно считать особым видом голода. Реалистичный пример живого замка - это когда два человека встречаются в узком коридоре. Оба они стараются избегать друг друга, чтобы друг друга могли проходить, но поскольку направление избегания одинаково, никто не может пройти через коридор в конце. Проще говоря, основное различие между живым замком и мертвым замком заключается в том, что состояние первого процесса может быть изменено, но не может быть продолжено выполнять.
29) Как определить, есть ли у поток блокировку?
Я никогда не знал, что мы могли бы обнаружить, имел ли у поток замок, пока я не посетил телефонное интервью. В java.lang.thread есть метод, который называется holdslock (), который возвращает true, когда и только тогда, когда текущий поток владеет блокировкой для определенного объекта. Вы можете проверить эту статью, чтобы узнать больше.
30) Как получить стек потоков в Java?
Для различных операционных систем есть несколько способов получить стек потока процессов Java. Когда вы получите стек потоков, JVM будет хранить состояние всех потоков в файл журнала или выводить его на консоли. В Windows вы можете использовать комбинацию клавиш CTRL + Break для получения стека потоков и использовать команду Kill -3 в Linux. Вы также можете использовать инструмент JStack для его получения, который работает на идентификаторах потоков, и вы можете использовать инструмент JPS для поиска идентификатора.
31) Какой параметр в JVM используется для управления стеком потоков с небольшим стеком
Эта проблема очень проста, параметр -xss используется для управления размером стека потока. Вы можете просмотреть список конфигурации JVM для получения дополнительной информации об этом параметре.
32) В чем разница между синхронизированным и повторным блоком в Java?
Java была в состоянии достичь взаимного исключения в течение длительного времени с помощью синхронизированных ключевых слов, и у нее есть некоторые недостатки. Например, вы не можете расширить методы или блокировать границы, отличные от замков, и вы не можете отменить на полпути при попытке приобрести замки и т. Д. Java 5 предоставляет более сложные элементы управления для решения этих проблем через интерфейс блокировки. Класс Reentrantlock реализует Lock, которая имеет такую же параллелизм и семантику памяти, что и синхронизированная, и она также расширяется. Вы можете проверить эту статью, чтобы узнать больше
33) Есть три потока T1, T2 и T3. Как убедиться, что они выполнены по порядку?
Есть много способов разрешения потоков выполнять в определенном порядке в многопользовании. Вы можете использовать метод join () класса потока, чтобы запустить другой поток в одном потоке, а другой поток завершает поток, чтобы продолжить выполнение. Чтобы обеспечить порядок трех потоков, вы должны запустить последний сначала (T3 вызовы T2, T2 вызовы T1), так что T1 будет выполнен первым, а T3 завершится последним. Вы можете проверить эту статью, чтобы узнать больше.
34) Какова функция метода доходности в классе потока?
Метод доходности может приостановить объект выполнения в настоящее время и разрешить другие потоки с тем же приоритетом для выполнения. Это статический метод и гарантирует, что текущий поток отдает использование ЦП и не может гарантировать, что другие потоки могут занять процессор. Поток, выполняющий доход (), может быть выполнен сразу после входа в приостановленное состояние. Нажмите здесь, чтобы узнать больше о методе урожайности.
35) Какова параллелизм concurrenthashmap в Java?
Concurrenthashmap делит фактическую карту на несколько частей для достижения его масштабируемости и безопасности резьбы. Это разделение получается с использованием параллелизма, который является необязательным параметром для конструктора класса ConcurrenthAshmap, со значением по умолчанию 16, так что можно избежать спора в ситуациях многопоточности. Для получения дополнительной оценки и внутреннего изменения размера, пожалуйста, прочитайте мою статью, как работает concurrenthashmap на Java.
36) Что такое семафор на Яве?
Semaphore в Java - это новый класс синхронизации, который является сигналом подсчета. Концептуально, концептуально, Semaphore поддерживает набор разрешений. При необходимости каждое приобретение () будет заблокировано до того, как лицензия станет доступной до ее получения. Каждый релиз () добавляет разрешение, которое может выпустить блокирующего приобретателя. Однако без использования фактического объекта лицензии, семафор только подсчитывает доступные номера лицензий и предпринимает соответствующие действия. Семафоры часто используются в многопоточном коде, например, пулы соединений базы данных. Для получения более подробной информации, пожалуйста, нажмите здесь.
37) Если вы отправите задачу, очередь пула потоков заполнена. Что происходит, когда это происходит?
Этот вопрос хитрый, и многие программисты будут думать, что задача будет блокировать, пока очередь пула потоков не будет. Фактически, если задача не может быть запланирована для выполнения, метод suppolexecutor () отправит исключение DecuceedExecutionException.
38) В чем разница между методами upper () и execute () в пуле потоков Java?
Оба метода могут представлять задачи в пул потоков. Способный тип возврата execute () метод является void, который определяется в интерфейсе исполнителя, и метод отправки () может вернуть будущий объект, удерживающий результаты расчета. Это определено в интерфейсе ExecutorService. Он расширяет интерфейс исполнителя. Другие классы пула потоков, такие как ThreadPoolexeCutor и PraduledThreadPoolexeCutor, имеют эти методы. Для получения более подробной информации, пожалуйста, нажмите здесь.
39) Что такое метод блокировки?
Метод блокировки означает, что программа будет ждать завершения метода и больше ничего не делает. Метод Accept () Serversocket () должен ждать, пока клиент подключится. Блокировка здесь означает, что текущий поток будет приостановлен до возврата результата вызова и не будет возвращаться до получения результата. Кроме того, существуют асинхронные и не блокирующие методы, которые возвращаются до выполнения задачи. Для получения более подробной информации, пожалуйста, нажмите здесь.
40) Свингевая нить безопасна? Почему?
Вы можете дать положительный ответ, качание не безопасно, но вы должны объяснить, почему этот ответ, даже если интервьюер не спросил вас, почему. Когда мы говорим, что свинг не безопасен для нити, он часто упоминает его компоненты, которые не могут быть изменены в многопоточной. Все обновления компонентов GUI должны быть завершены в потоках AWT. Swing предоставляет два синхронных и асинхронных метода обратного вызова для обновления. Нажмите здесь, чтобы увидеть больше контента, связанного с безопасностью и безопасностью потока.
41) В чем разница между InvokeandWait и Invokelater на Java?
Эти два метода предоставляются Swing API для разработчиков Java для обновления компонентов графического интерфейса из текущего потока, а не в потоке диспетчеры событий. InvokeandWait () Синхронно обновляет компоненты графического интерфейса, такие как строка прогресса. Как только прогресс обновляется, панель прогресса также должна быть изменена соответственно. Если прогресс отслеживается несколькими потоками, то метод InvokeAndwait () вызывается для запроса потока диспетчерской события для соответствующего обновления компонента. Метод Invokelater () вызывается асинхронно для обновления компонента. Для получения более подробной информации, пожалуйста, нажмите здесь.
42) Какие методы в свинговом API безопасны?
В этом вопросе также упоминается безопасность качания и нити. Хотя компоненты не являются потоковыми, есть некоторые методы, которые можно назвать многопоточно, например, Repaint () и Revalidate (). Метод setText () JTextComponent и Insert () и Append () Method of JTextArea также безопасны для потока.
43) Как создать неизменную объект в Java?
Эта проблема, по-видимому, не имеет ничего общего с многопоточным, но инвариантность помогает упростить уже сложные параллельные программы. Необываемые объекты могут быть разделены без синхронизации, уменьшая накладные расходы на синхронизацию при одновременном доступе к объекту. Тем не менее, у Java нет @Immutable аннотации. Для создания неизменного класса нам необходимо выполнить следующие шаги: инициализировать всех участников через конструктор, не предоставлять метод сеттера для переменной и объявить всех участников частными, чтобы эти участники не разрешали обращаться непосредственно. В методе Getter не возвращайте сам объект, но клонируйте объект и возвращайте копию объекта. Моя статья «Как сделать объект непотимым» в Java, имеет подробные учебные пособия, и вы можете быть полны уверенности после прочтения.
44) Что такое ReadWritelock в Java?
Вообще говоря, чтение и записи блокировки являются результатом технологии разделения блокировки, используемой для повышения производительности параллельных программ. ReadWritelock в Java-это новый интерфейс, добавленный в Java 5. ReadWritelock поддерживает пару связанных замков, один для операций только для чтения и один для записи. Замок для чтения может храниться несколькими потоками чтения одновременно без потока записи. Замок записи эксклюзив, вы можете реализовать это правило, используя ReenterTreadWritelock в JDK, который поддерживает до 65535 блокировки записи и 65535 чтения.
45) Что такое занятый цикл в многопользовании?
Занятые петли - это когда программисты используют петли, чтобы заставлять нить ждать. В отличие от традиционных методов, таких как wait (), sleep () или helive (), все они отказываются от контроля процессора, в то время как занятые петли не отказываются от процессора, он просто запускает пустую петлю. Цель этого - сохранить кеш ЦП. В многоядерной системе один, ожидающий пробуждения потока, может работать в другом ядре, которое восстановит кеш. Он доступен, чтобы избежать восстановления кеша и сокращения времени в ожидании восстановления. Вы можете проверить эту статью для получения дополнительной информации.
46) В чем разница между летучими переменными и атомными переменными?
Это интересный вопрос. Во -первых, летучая переменная выглядит очень похоже на атомную переменную, но функции различны. Колатильная переменная обеспечивает отношения предшественника, то есть операции записи будут происходить до последующих операций чтения, но она не гарантирует атома. Например, изменение переменной счета с помощью летучей операции, то операция Count ++ не является атомной. Атомный метод, предоставленный классом Atomicinteger, может сделать эту операцию атомной. Например, метод GetAndIncrement () будет выполнять операции атомного приращения, чтобы добавить текущее значение одним, а другие типы данных и эталонные переменные также могут выполнять аналогичные операции.
47) Что произойдет, если поток в блоке синхронизации бросает исключение?
Этот вопрос обманул многих программистов Java. Если вы можете подумать о том, выпускает ли Lock на этот подсказку ответ, вы все равно надеетесь ответить правильно. Независимо от того, выходит ли ваш блок синхронизации нормально или ненормально, потоки внутри выпускают блокировку, поэтому я предпочитаю блок синхронизации по сравнению с интерфейсом блокировки, потому что он не требует, чтобы я тратил свою энергию, чтобы освободить блокировку. Эта функция может быть реализована путем выпуска блокировки в блоке, наконец,.
48) Что такое блокировка двойной проверки в режиме Синглтона?
Этот вопрос часто задается в интервью Java, но интервьюер только на 50% удовлетворен ответом на этот вопрос. Половина людей не может написать двойную проверку блокировки, и половина людей не может сказать, что это скрытые опасности, и как Java 1.5 исправил это. На самом деле это старый метод создания защитников нити синглтонов. Когда впервые создан экземпляр Singleton, он пытается оптимизировать производительность с помощью одного блокировки, но поскольку он слишком сложный, он терпит неудачу в JDK1.4, и мне это тоже не нравится. В любом случае, даже если вам это не нравится, вы все равно должны понять это, потому что его часто спрашивают. Вы можете проверить, как двойная проверка блокировки в Singleton Works для получения дополнительной информации.
49) Как создать защитный синглтон в Java?
Это продолжение вышеуказанного вопроса. Если вам не нравятся двойные блокировки проверки, а интервьюер спросил об альтернативном методе создания класса Singleton, вы можете использовать функции загрузки класса JVM и статическую инициализацию переменной для создания экземпляра Singleton или использовать типы перечисления для создания Singleton. Мне нравится этот метод. Вы можете проверить эту статью для получения дополнительной информации.
50) Напишите 3 лучших практиках многопоточных чтений, за которыми вы следуете
Мне больше всего нравится такая проблема, и я считаю, что вы будете следовать определенным лучшим практикам при написании одновременного кода для повышения производительности. Вот три лучших практики, я думаю, большинство программистов Java должны следовать:
Дайте вашей ветке значимое имя.
Это позволяет легко найти ошибки или отслеживать их. Заказ Processor, quoteprocessor или TradeProcessor Это имя намного лучше, чем Thread-1. Потока 2 и нить-3. Дайте потоке имя, связанное с задачей, которую он хочет выполнить. Все основные рамки и даже JDK следуют этой лучшей практике.
Избегайте блокировки и сужения объема синхронизации
Замок дорого, а переключение контекста более много времени требует. Попробуйте использовать синхронизацию и замки, чтобы минимизировать критическую область. Поэтому я предпочитаю блоки синхронизации по сравнению с методом синхронизации, который дает мне абсолютный контроль над блокировкой.
Используйте больше классов синхронизации и используйте меньше ожидания и уведомления
Во -первых, Countdownlatch, Semaphore, Cyclicbarrier и Sybrange Synchronous Class упрощают операции кодирования, в то время как трудно управлять сложными управляющими потоками с ожиданием и уведомлением. Во -вторых, эти классы написаны и поддерживаются лучшими предприятиями. Они будут продолжать быть оптимизированными и улучшенными в последующих JDK. Используя эти инструменты синхронизации более высокого уровня, ваша программа может быть оптимизирована без каких-либо усилий.
Используйте больше параллельных наборов и менее синхронизированных наборов. Это еще одна легкая лучшая практика. Параллельные наборы более масштабируемы, чем синхронизированные наборы, поэтому использование одновременных наборов лучше для одновременного программирования. Если вам нужно использовать карту в следующий раз, вам следует сначала подумать об использовании concurrenthashmap. Моя статья Java Condurrent Collections имеет более подробное описание.
51) Как заставить запустить поток?
Эта проблема похожа на то, как заставить Java Girbage Soblection. Пока нет способа сделать это. Хотя вы можете использовать System.gc () для выполнения сборки мусора, он не гарантированно будет успешным. Невозможно заставить поток начать в Java, он управляется планировщиком потока, а Java не публикует соответствующий API.
52) Что такое структура соединения вилки в Java?
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。