Название следующее:
открытый класс TestSync2 реализует Runnable {int b = 100; синхронизированный void m1 () бросает прерванные эктриэкцепции {b = 1000; Thread.sleep (500); // 6 System.out.println ("b =" + b); } синхронизированный void m2 () бросает прерывание {thread.sleep (250); // 5 b = 2000; } public static void main (string [] args) бросает прерывания, {testSync2 tt = new TestSync2 (); Поток t = новый поток (TT); // 1 t.start (); // 2 tt.m2 (); // 3 System.out.println ("Основной поток b =" + tt.b); // 4} @Override public void run () {try {m1 (); } catch (прерванное искусство e) {e.printstacktrace (); }}}Результат вывода этой программы?
Результаты вывода программы
Основной поток B = 2000b = 1000
или
Основная потока B = 1000b = 1000
Проверьте знания
В Java многопоточные программы являются наиболее трудными для понимания и отладка. Много раз результаты выполнения не выполняются, как мы представляли. Следовательно, в Java очень трудно многопоточного. Я смутно помню, когда я принимал уровень 2 -го языка в колледже, в чем вопрос в ++, и многие другие уровни приоритетов соответствуют результатам окончательных результатов. Я хочу взять некоторые вопросы приоритета бегуна и комбинированные вопросы для этого типа вопросов. Просто прочитайте это, поддерживая его, но многопоточная Java по-прежнему должен быть хорошо понят, спинка не может быть сделана.
Давайте начнем краткий анализ:
Этот вопрос включает в себя 2 потока (основной поток Main, детский поток), а ключевые слова включают синхронизированный и поток. Sleep.
Синхронизированное ключевое слово по -прежнему довольно сложное (иногда я не очень хорошо его понимаю, поэтому приведенный выше вопрос имеет некоторое недопонимание). Его функция состоит в том, чтобы реализовать синхронизацию потоков (существует много методов для реализации синхронизации потоков, это только что-то вроде других вещей, о которых будут говорить последующие статьи. Некоторые реализации мастера Дуга Лиа должны быть тщательно изучены). Его задача состоит в том, чтобы заблокировать код, который требует синхронизации, чтобы только один поток мог вводить блок синхронизации за раз (на самом деле, это пессимистическая стратегия), чтобы гарантировать, что поток только помнит безопасность.
Использование общего ключевого слова синхронизировано
В приведенном выше коде использование синхронизации фактически принадлежит второму случаю. Непосредственно действует на методе экземпляра: он эквивалентен блокировке текущего экземпляра. Перед входом в код синхронизации вы должны получить блокировку текущего экземпляра.
Возможные недоразумения
1. Поскольку мы не понимаем синхронизированный, много раз, мы работаем с синхронизированным методом с помощью многопоточного. Когда два потока называют 2 различных синхронизированных методов, считается, что это не имеет значения. Эта идея является недоразумением. Непосредственно действует на методе экземпляра: он эквивалентен блокировке текущего экземпляра. Перед входом в код синхронизации вы должны получить блокировку текущего экземпляра.
2. Если вызывается синхронизированный метод. Еще один призыв к нормальному методу не имеет ничего общего, и у них нет отношений ожидания.
Они очень полезны для последующего анализа.
Thread.sleep
Защитите текущий поток (то есть поток, который вызывает метод) в течение определенного периода времени, давая другим потокам возможность продолжить выполнение, но он не выпускает блокировку объекта. То есть, если синхронизированная синхронизация быстрая, другие потоки все еще не могут получить доступ к общим данным. Обратите внимание, что этот метод должен поймать исключения, что очень полезно для последующего анализа.
Процесс анализа
Java выполняется из основного метода. Говорят, что есть 2 потока, но даже если вы измените приоритет потока здесь, это бесполезно. Приоритет только тогда, когда две программы еще не были выполнены. Теперь, как только этот код будет выполнен, основной поток был выполнен. Для переменной атрибута int b = 100 не будет никакой проблемы видимости, поскольку используется синхронизированный (и не нужно говорить, что используется летучая объявление), при выполнении шага 1 (поток t = новый поток (TT); // 1) поток находится в новом состоянии и еще не начал работать. Когда выполняются 2 шага (T.Start (); // 2) Когда вызывается метод запуска, поток фактически запускается и входит в запущенное состояние. Заполнимое состояние означает, что оно может быть выполнено, и все готово, но это не означает, что оно должно быть выполнено на процессоре. Существует ли реальное выполнение, зависит от планирования процессора службы. Здесь, выполняя 3 шага, вы должны сначала получить блокировку (потому что старт должен вызвать нативный метод, и все готово после завершения использования, но это не означает, что он должен быть выполнен на процессоре. Будь то реальное выполнение, зависит от планирования процессора службы, а затем будет вызван метод выполнения, и метод M1 будет выполнен). На самом деле, не имеет значения, является ли нить. Когда 3 шага выполняются, дочерняя поток на самом деле готов в ближайшее время, но поскольку синхронизированный существует и действует как тот же объект, дочерний поток должен ждать. Поскольку порядок выполнения в основном методе выполняется последовательно, он должен быть завершен после выполнения шага 3 до достижения 4 -го шага. Поскольку выполнение шага 3 завершено, дочерний поток может выполнить M1. Здесь есть проблема, которая сначала получает многопоточную. Если 4 шага получают сначала, то основной поток B = 2000. Если дочерняя потока M1 получена, B, возможно, был назначен на 1000 или до назначения 4 шагов, возможным результатом является основной поток B = 1000 или основной поток B = 2000. Если здесь удалены 6 шагов, то B = выполнить до и основной поток B = до того, как неясно. Однако, поскольку существует 6 шагов, независимо от того, что основной поток B = впереди, поэтому это зависит от ситуации, если она равна 1000 или 2000. После этого B = 1000 определенно фиксируется.
Некоторые предложения для многопоточного
Есть также несколько советов, чтобы поделиться в последующих статьях. Многопользовательский характер особенно важен и сложный. Я надеюсь, что все будут тратить на это больше времени.
Некоторые методы отладки для многопоточного чтения
Из -за точек останова все потоки должны останавливаться при прохождении через точки останова, что приводит к постоянному прерыванию этой точки, что очень неудобно. В Eclispe есть условные точки остановки, и вы можете остановиться, когда условия будут выполнены, так что это удобно.
Суммировать
Вышеуказанное является самым сложным вопросом на интервью Java в истории, который редактор представил вам. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!