Многие основные вопросы интервью Java поступают из многопоточных фреймворков. Опытный практический опыт необходим при понимании концепции основных потоков. Эта статья собирает несколько типичных вопросов о резьбе Java, о которых часто задают старшие инженеры.
0. Что такое многопоточная синхронизация в Java?
В рамках многопоточных программ синхронизация может контролировать доступ к общим ресурсам. Если нет синхронизации, когда поток Java модифицирует общую переменную, другой поток использует или обновляет ту же переменную, что может легко привести к неправильным результатам в программе.
1. Объясните несколько способов реализации мультипотового?
Поток Java может реализовать запускаемый интерфейс или наследовать класс потока для его реализации. Когда вы планируете унаследовать несколько раз, вы предпочтете реализовать Runnable.
2. В чем разница между Thread.start () и Thread.Run ()?
Метод Thread.Start () (нативный) запускает поток и входит в состояние готового состояния. Когда ЦП выделяет время по потоку, JVM планирует выполнить метод run ().
3. Зачем нам методы run () и start ()? Можем ли мы просто использовать метод run () для выполнения задачи?
Нам нужны два метода run () и start (), потому что JVM создает отдельный поток, отличный от вызова обычных методов, поэтому эта работа выполняется методом начала потока. START реализуется локальным методом и должен быть называться отображаемым. Еще одним преимуществом использования этих двух методов является то, что любой объект может быть запущен в качестве потока. Пока реализуется выполняемый интерфейс, это позволяет избежать множественных проблем наследования Java, вызванных унаследованием класса потоков.
4. Что такое класс Threadlocal и как его использовать?
Threadlocal-это локальная переменная на уровне потока, а не «локальный поток». Threadlocal предоставляет независимую копию переменной для каждого потока, которая использует переменную. Каждый поток не влияет на копию других объектов потока при изменении копии (примечание переводчика).
Вот ключевые моменты локальных переменных потока:
Поток локальной переменной (Threadlocal переменная) Удобно предоставляет отдельную переменную для каждого потока.
Трентокальные экземпляры обычно появляются в классе как статические частные (частные статические) поля, которые используются для связывания потока.
Когда несколько потоков получают доступ к экземплярам Threadlocal, каждый поток поддерживает независимую копию переменных, предоставленных Threadlocal.
Обычно используемые виды использования можно увидеть в режиме DAO. Когда класс DAO является классом Singleton, подключение к базе данных независимо поддерживается каждым потоком и не влияет друг на друга. (Синглтон на основе потока)
5. Когда будет брошена InvalidmonitorStateException и почему?
При вызове какого -либо из методов в wait ()/notify ()/notifyall (), если текущий поток не получает блокировку объекта, будет брошено исключение OldalMonitorStateException (то есть, когда программа не выполняет какой -либо блок синхронизации или метод синхронизации объекта, она все еще пытается вызвать WAT ()/utify ()/utifyall ()). Поскольку исключением является подкласс runtimeexcpetion, исключение не должно быть пойман (хотя вы можете поймать его столько, сколько захотите). В качестве Runtimeexception такие исключения не упоминаются в подписании метода wait (), notify (), notifyall ().
6. В чем разница между Sleep (), Survend () и Wait ()?
Thread.sleep () делает текущий поток в состоянии «не запускаемой» в указанное время. Поток всегда удерживает монитор объекта. Например, если поток в настоящее время находится в блоке синхронизации или методе синхронизации, другие потоки не могут ввести блок или метод. Если другой поток вызывает метод Enterrupt (), он разбудит этот поток «спящего».
Примечание: Sleep () - это статический метод. Это означает, что он действителен только для текущего потока, и общей ошибкой является вызов t.sleep () (здесь t - это поток, отличный от текущего потока). Даже если t.sleep () выполняется, текущий поток ложится спать, а не T -поток. t.suspend () - устаревший метод. Использование приостановки () приводит к тому, что поток попадает в застойное состояние. Поток всегда будет удерживать монитор объекта, и Supply (), вероятно, вызовет проблемы с тупиком.
object.wait () заставляет текущий поток выходить из «беззагоняющего» состояния. В отличие от Sleep (), подождите - это метод объекта, а не потока. При вызове object.wait () поток сначала должен получить блокировку объекта этого объекта. Текущий поток должен хранить синхронизированный объект блокировки и добавить текущий поток в очередь ожидания. Затем другой поток может синхронизировать ту же блокировку объекта, чтобы вызвать object.notify (), который разбудит поток, который первоначально ожидал, а затем отпустит блокировку. В основном wat ()/notify () аналогична Sleep ()/Enterrupt (), за исключением того, что первое требует приобретения блокировки объекта.
7. Что происходит при использовании синхронизации на статических методах?
При синхронизации статического метода будет получен объект «класса» класса. Следовательно, когда поток входит в синхронизированный статический метод, монитор потока получает блокировку объекта самого класса, а другие потоки не могут ввести любой метод статической синхронизации этого класса. Это не похож на метод экземпляра, потому что несколько потоков могут получить доступ к различным экземплярам одновременно синхронным методам экземпляра.
8. Когда был выполнен метод синхронизации, может ли поток вызвать метод асинхронного экземпляра на объекте?
Да, асинхронный метод всегда может быть вызван без каких -либо проблем. Фактически, Java не выполняет никаких проверок на асинхронные методы, а объекты блокировки проверяются только в методах синхронизации или блоках синхронного кода. Если метод не объявляется синхронным, даже если вы используете общие данные, Java по -прежнему будет называть его без проверки, безопасно ли это, поэтому будьте особенно осторожны в этом случае. Является ли метод, объявленный синхронным, зависит от критического доступа в разделе. Если метод не доступа к критическому разделу (общие ресурсы или структуры данных), нет необходимости объявлять синхронный.
Вот пример: Common Class имеет два метода SynchronizedMethod1 () и Method1 (), и класс Mythread вызывает эти два метода в независимом потоке.
открытый класс common {public synchronized void synchronizedmethod1 () {System.out.println ("SynchronizedMethod1 называется"); try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("SynchronizedMethod1 DED"); } public void method1 () {System.out.println ("Метод 1 называется"); try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Метод 1 выполнен"); }} открытый класс Mythread Extends Thread {private int id = 0; частный общий общий; public mythread (string name, int no, common object) {super (name); common = object; id = нет; } public void run () {System.out.println ("Запуск потока" + this.getName ()); try {if (id == 0) {common.synchronizedmethod1 (); } else {common.method1 (); }} catch (Exception e) {e.printstackTrace (); }} public static void main (string [] args) {common c = new common (); Mythread T1 = New Mythread ("Mythread-1", 0, C); Mythread T2 = New Mythread ("Mythread-2", 1, C); t1.start (); t2.start (); }}Вот результат программы:
Запуск Threatmythread-1
SynchronizedMethod1 называется
Запуск Threatmythread-2
Метод 1 вызван
Синхронизированныйметод1 выполнен
Метод 1 выполнен
Результаты показывают, что даже если будет выполнен метод SynchronizedMethod1 (), будет вызовет метод1 ().
9. Могут ли два потока назвать два различных метода синхронных экземпляров на объекте?
Нет, поскольку объект синхронизировал метод экземпляра, поток получает блокировку объекта объекта. Следовательно, другие методы синхронизации могут быть выполнены только после того, как метод будет выпущен после освобождения блокировки объекта. Следующий пример кода очень ясен: общий класс имеет методы SynchronizedMethod1 () и SynchronizedMethod2 (), и Mythread вызывает эти два метода.
открытый класс common {public synchronized void synchronizedmethod1 () {System.out.println ("SynchronizedMethod1 называется"); try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("SynchronizedMethod1 DED"); } public Synchronized void synchronizedmethod2 () {System.out.println ("SynchronizedMethod2 называется"); try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("SynchronizedMethod2 DED"); }} открытый класс Mythread Extends Thread {private int id = 0; частный общий общий; public mythread (string name, int no, common object) {super (name); common = object; id = нет; } public void run () {System.out.println ("Запуск потока" + this.getName ()); try {if (id == 0) {common.synchronizedmethod1 (); } else {common.synchronizedmethod2 (); }} catch (Exception e) {e.printstackTrace (); }} public static void main (string [] args) {common c = new common (); Mythread T1 = New Mythread ("Mythread-1", 0, C); Mythread T2 = New Mythread ("Mythread-2", 1, C); t1.start (); t2.start (); }}10. Что такое тупик
Тухлокон означает, что две или более потоков бесконечно заблокированы, а потоки ждут друг друга для необходимых ресурсов. Это может произойти, когда два потока попытаются получить блокировки для других ресурсов, и каждый поток на неопределенный срок ждет выпуска других блокировки ресурсов, если пользовательский процесс не завершен. Что касается Javaapi, то в следующей ситуации могут возникнуть тупики.
11. Что такое нить голодает до смерти и что такое живой замок?
Несмотря на то, что голода и жизненные блокировки не считаются общими проблемами, такими как тупики, они похожи на встречу дизайнеров одновременного программирования.
Когда все потоки заблокированы или не могут быть обработаны, поскольку необходимый ресурс недействителен, не блокируют потоки, чтобы сделать ресурс доступным. В следующих ситуациях может возникнуть живые замки в Javaapi:
Вопросы здесь не подробны, я надеюсь, что они будут полезны для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!