
- •Типы join'ов в sql
- •1.Что такое класс Object? Какие в нем есть методы?
- •13. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? а если protected? а сузить видимость?
- •Volatile-
- •2 Потока работают с одним объектом Obj. Один готовит данные, а другой отправляет их. Первый подготовил данные и вызвал:
- •42. Назовите несколько классов из вершины иерархии исключений в Java.
Volatile-
Поток создается с чистой рабочей памятью и должен перед использованием загрузить все необходимые переменные из основного хранилища(можна сказать что он имеет некий кеш). Любая переменная сначала создается в основном хранилище и лишь затем копируется в рабочую память потоков, которые будут ее применять. Если переменная объявлена , как volatile, то ее чтение и запись будет прозводится из\в основное хранилище.
чтение volatile переменных синхронизировано и запись в volatile переменные синхронизирована, а неатомарные операции – нет. 38. Какие особенности использования метода wait? При каких условиях поток может выйти из режима ожидания? Каждый объект вJava имеет не только блокировку для synchronized блоков и методов(монитор), но и так называемый wait-set, набор потоков исполнения. Любой поток может вызвать метод wait() любого объекта и таким образом попасть в его wait-set. При этом метод wait() снимает блокировку с объекта, а выполнение такого потока приостанавливается до тех пор, пока другой поток не вызовет у этого же объекта метод notifyAll(), который пробуждает все потоки из wait-set. Метод notify()пробуждает один случайно выбранный поток из данного набора.
Однако применение этих методов связано с одним важным ограничением. Любой из них может быть вызван потоком у объекта только после установления блокировки на этот объект. То есть либо внутри synchronized -блока с ссылкой на этот объект в качестве аргумента, либо обращения к методам должны быть в синхронизированных методах класса самого объекта.
Можно сделать вывод, что потоки, прежде чем приостановить выполнение после вызова метода wait(), отпускают все занятые блокировки. Итак, вызывается метод notifyAll(). Как уже было сказано, все потоки из wait-set возобновляют свою работу. Однако чтобы корректно продолжить исполнение, необходимо вернуть блокировку на объект, ведь следующая команда также находится внутри synchronized -блока!
После вызова notifyAll() все потоки не могут сразу возобновить работу. Лишь один из них сможет вернуть себе блокировку и продолжить работу. Когда он покинет свой synchronized -блок и отпустит объект, второй поток возобновит свою работу, и так далее. Если по какой-то причине объект так и не будет освобожден, поток так никогда и не выйдет из метода wait(), даже если будет вызван метод notifyAll().
Кроме того, определен метод wait() с параметром, который задает период тайм-аута, по истечении которого поток сам попытается возобновить свою работу. Но начать ему придется все равно с повторного получения блокировки.
Использование:
2 Потока работают с одним объектом Obj. Один готовит данные, а другой отправляет их. Первый подготовил данные и вызвал:
Obj.notifyall();//-разбудил протокол отправки данных
Obj.wait();//- сам перешел в режим ожидания и отпустил блокировку объекта.
Аналогично делает поток 2. Отправил данные и вызвал:
Obj.notifyall();-разбудил протокол подготовки данных и
Obj.wait(); сам перешел в режим ожидания и отпустил блокировку объекта.
Метод wait() ожидает выполнения некоторого условия неподконтрольного для текущего метода. Часто это условие изменяется в результате выполнения другой задачи. Активное ожидание, то есть проверка условия в цикле приводит к неэфективному рассходованию вычислительных ресурсов.Таким образом метод wait () обеспечивает механизм синхронизации между задачами.
39. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
??? 40. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков? LinkedList,-для очереди потоков, wait(),notify()-для синхронизации потоков и переключения между ними 41. Какие виды исключений в Java вы знаете, чем они отличаются?
Все исключительные ситуации можно разделить на две категории: проверяемые(checked) и непроверяемые(unchecked).
Все исключения, порождаемые от Throwable, можно разбить на три группы. Они определяются тремя базовыми типами: наследникамиThrowable- классами Errorи Exception, а также наследником Exception - RuntimeException.
Ошибки, порожденные от Exception (и не являющиеся наследниками RuntimeException ), являются проверяемыми. Т.е. во время компиляции проверяется, предусмотрена ли обработка возможных исключительных ситуаций. Как правило, это ошибки, связанные с окружением программы (сетевым, файловым вводом-выводом и др.), которые могут возникнуть вне зависимости от того, корректно написан код или нет. Например, открытие сетевого соединения или файла может привести к возникновению ошибки и компилятор требует от программиста предусмотреть некие действия для обработки возможных проблем. Таким образом повышается надежность программы, ее устойчивость при возможных сбоях.
Исключения, порожденные от RuntimeException, являются непроверяемыми и компилятор не требует обязательной их обработки.
Как правило, это ошибки программы, которые при правильном кодировании возникать не должны (например,IndexOutOfBoundsException- выход за границы массива, java.lang.ArithmeticException- деление на ноль). Поэтому, чтобы не загромождать программу, компилятор оставляет на усмотрение программиста обработку таких исключений с помощью блоков try-catch.
Исключения, порожденные от Error, также не являются проверяемыми. Они предназначены для того, чтобы уведомить приложение о возникновении фатальной ситуации, которую программным способом устранить практически невозможно (хотя формально обработчик допускается). Они могут свидетельствовать об ошибках программы, но, как правило, это неустранимые проблемы на уровне JVM. В качестве примера можно привести StackOverflowError (переполнение стека), OutOfMemoryError (нехватка памяти).
Методы, код которых может порождать проверяемые исключения, должны либо сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово throws с перечислением необрабатываемых проверяемых исключений. На непроверяемые ошибки это правило не распространяется.
Переопределенный ( overridden ) метод не может расширять список возможных исключений исходного метода.