Ключевое слово synchronized Java

Ключевое слово synchronized JavaВ ранних статьях блога вы видели, как надо использовать объекты Lock и Condition. Прежде чем двинуться дальше, подведем итоги, перечислив ключевые моменты, касающиеся блокировок и условий.

  • Блокировка защищает сегмент кода, позволяя только одному потоку в единицу времени выполнять этот код.
  • Блокировка управляет потоками, которые пытаются войти в защищенный сегмент кода.
  • Каждый объект условия управляет потоками, вошедшими в защищенный сегмент кода, но которые пока не в состоянии выполнять работу.

Интерфейсы Lock и Condition были добавлены в Java SE 5.0, чтобы предоставить программистам высокую степень контроля блокировок. Однако в большинстве ситуации вам не понадобится такой контроль, и вы можете использовать механизм, построенный на средствах языка Java. Читать

Использование диагностических утверждений Java

Использование диагностических утверждений JavaДиагностические утверждения(assertion) — это широко распространенные идиомы, применяемые для обеспечения надежности программирования. Допустим, вы убеждены в том, что конкретное свойство уже задано, и ссылаетесь на него в своей программе. Предположим, что вы вычисляете следующее выражение:

Вы уверены, что число x — неотрицательное. Возможно, оно получено в результате других вычислений, которые не могут порождать отрицательные числа, либо является параметром метода, которому можно передавать лишь положительные числа. Но вы все же хотите еще раз проверить свои предположения, чтобы в ходе выполнения программы не возникло ошибки. Читать

Анализ элементов трассировки стека Java

Анализ элементов трассировки стека JavaТрассировка стека — это список вызовов методов для данной точкой программы. Вы наверняка неоднократно видели эту информацию, она отображается каждый раз, когда при выполнении Java-программы возникает неконтролируемые исключение.

В версиях, предшествующих Java SE 1.4, для получения текстового описания трассировки стека применялся метод printStackTrace() класса Throwable. Теперь разработчикам доступен метод getStackTrace() он возвращает массив объектов StackTraceElement, которые можно анализировать в программе. Например: Читать

JNLP API Java

JNLP API JavaJNLP API позволяет неподписанному приложению запускаться в «песочнице» и в то же время получать безопасный доступ к локальным ресурсам. Например, в нем предусмотрены службы для загрузки и сохранения файлов. Приложения не видит файловой системы и не может специфицировать имена файлов.

Вместо этого отображается файловый диалог, и пользователь программы выбирает файл. Перед появлением диалогового окна для выбора файлов пользователь получает предупреждение и должен выразить согласие на продолжение работы. Более того, на самом деле API не предоставляет программе доступа к объекту File.

В частности, приложение не может самостоятельно обнаружить файл. Поэтому программистам предоставляются инструменты для реализации действий открытия и сохранения файла, но системная информация максимально скрыта от сомнительных приложений. Читать

Ограничение переменных типов Java

Ограничение переменных типов JavaИногда класс или метод нуждается в наложении ограничений на переменные типов. Приведем типичный пример. Нужно вычислить минимальный элемент массива:

Но здесь есть проблема. Взгляните на код метода min(). Переменная smallest имеет тип Т, а это означает, что она может быть объектом произвольного класса. Откуда мы знаем, имеет ли класс Т метод compareTo()? Читать

Симметричные шрифты в языке Java

Симметричные шрифты в языке JavaКриптографическое расширение Java содержит класс Cipher, который является суперклассом всех классов, имеющих отношение к шифрованию. Для создания объекта, реализующего алгоритм шифрования, используется метод getInstance():

В JDK для всех шифров используется поставщик SunJCE. Если имя поставщика не указано явно, то по умолчанию принимается имя SunJCE. Если вы хотите воспользоваться алгоритмами, которые не поддерживаются инструментами Sun, следует указать другого поставщика.

Имя алгоритма задается в виде строки, например «DES» или «DES/CBC/PKCS5Padding». Читать

Использование аннотаций в языке Java

Использование аннотаций в языке JavaАннотациями(annotations) называются дескрипторы, которые разработчики вставляют в свой исходный код для того, чтобы та или иная утилита могла обрабатывать их. Эти утилиты могут работать как на уровне исходного кода, так и на уровне файлов классов, в которые компилятор помещает аннотации.

Аннотации не влияют на способ компиляции программ. Компилятор Java генерирует одинаковые инструкции виртуальной машины как с, так и без аннотаций.

Для извлечения пользы из аннотаций необходимо выбирать средство обработки (processing tool). В код вставляются аннотации, понятные определенному средству обработки, которое потом всегда и применяется для их расшифровки. Читать

Написание сценариев для платформы Java

Написание сценариев для платформы JavaЯзык сценариев — это такой язык, который позволяет избегать обычного цикла операций редактирования, компиляции, связывания и выполнения за счет осуществления интерпретации текста программы во время выполнения. Язык сценариев обладают рядом преимуществ.

  • Быстрый цикл работы, стимулирующий желание к экспериментированию.
  • Возможность изменения поведения выполняющейся программы.
  • Возможность выполнения настройки пользователями программы.

С другой стороны, у большинства языков программирования отсутствуют функций, необходимые для программирования сложных приложений, вроде строгого контроля типов, инкапсуляции и модульности. Читать

Иерархия загрузчиков классов Java

Иерархия загрузчиков классов JavaЗагрузчики классов связаны отношениями родитель/потомок. У каждого загрузчика классов, за исключением первичного, имеется родительский загрузчик классов. Предполагается, что загрузчик классов дает шанс своему родителю загружать любой нужный класс и загружает его сам только в том случае, если этого не может сделать родитель. Например, если системный загрузчик классов запрашивает загрузку системного класса(например, java.util.arrayList), то прежде он предлагает загрузить его расширенному загрузчику классов.

Расширенный загрузчик классов, в свою очередь, предлагает сделать это первичному загрузчику классов. Наконец, первичный загрузчик классов находит и загружает класс из файла rt.jar при этом все другие загрузчики классов прекращают дальнейший поиск.

Некоторые программы имеют основанную на подключаемых модулях архитектуру, в которой определенные части кода упаковываются в виде дополнительных необязательных модулей. Если подключаемые модули упаковываются в виде файлов JAR, классы этих модулей могут загружаться просто с помощью экземпляра URLClassLoader: Читать

Класс Executors в Java

Класс Executors в JavaСоздание нового потока — довольно дорогостоящая операция, поскольку включает взаимодействие с операционной системой. Если ваша программа создает большое количество кратковременных потоков, то имеет смысл использовать пул потоков. Пул потоков содержит множество простаивающих потоков, готовых к запуску. Вы помещаете Runnable в пул, и один из потоков вызывает его метод run(). Когда метод run() завершается, поток не уничтожается и остается в пуле в готовности обслужить новый запрос. Читать