Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория экзамен.doc
Скачиваний:
25
Добавлен:
29.05.2015
Размер:
516.61 Кб
Скачать

9. Класс LinkedList и его методы

java.lang. Объект

    • java.util. AbstractCollection<E>

      • java.util. AbstractList <E>

        • java.util. AbstractSequentialList <E>

          • java.util. LinkedList <E>

  • Введите Параметры:

E - тип элементов сохранен в этом наборе

Все Реализованные Интерфейсы:

СериализуемыйCloneableПовторяемый <E>, Набор <E>, Двухсторонняя очередь <E>, Список <E>, Очередь <E>

public class LinkedList<E>

extends AbstractSequentialList<E>

implements List<E>, Deque<E>, Cloneable, Serializable

Реализация двунаправленного связанного списка List и Deque интерфейсы. Реализации все дополнительные операции списка, и разрешения все элементы (включая null).

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

Отметьте, что эта реализация не синхронизируется. Если многократные потоки получают доступ к связанному списку одновременно, и по крайней мере один из потоков изменяет список структурно, это должносинхронизироваться внешне. (Структурная модификация является любой работой, которая добавляет или удаляет один или более элементов; просто установка значения элемента не является структурной модификацией.) Это обычно выполняется, синхронизируясь на некотором объекте, который естественно инкапсулирует список. Если никакой такой объект не существует, список должен быть "обернут", используяCollections.synchronizedList метод. Это лучше всего делается во время создания, чтобы предотвратить случайный несинхронизируемый доступ к списку:

List list = Collections.synchronizedList(new LinkedList(...));

iterators возвратился этим class iterator и listIterator методы являются сбоем быстро: если список структурно изменяется когда-либо после того, как iterator создается, всегда кроме через собственного Итерэтора remove или add методы, iterator бросит a ConcurrentModificationException. Таким образом, перед лицом параллельной модификации, iterator перестал работать быстро и чисто, вместо того, чтобы рискнуть произвольным, недетерминированным поведением в неопределенное время в будущем.

Отметьте, что поведение сбоя быстро iterator не может быть гарантировано, как, вообще говоря, невозможно сделать любые трудные гарантии в присутствии несинхронизируемой параллельной модификации. Приведите бросок iterators к сбою быстро ConcurrentModificationException на основе максимальных усилий. Поэтому, было бы неправильно записать программу, которая зависела от этого исключения для его правильности: поведение сбоя быстро iterators должно использоваться только, чтобы обнаружить ошибки.

Этот class является элементом Платформы Наборов Java.

10. Общая характеристика потоков Java

В этой статье рассказывается, как реализовать потоки, используя язык программирования Java. Перед тем как рассмотреть детали программирования на Java, давайте приступим к обзору о потоках в общем.

Если сказать просто, то поток(thread) – это путь программного выполнения. Большинство программ, написанных сегодня, запускаются одним потоком, проблемы начинают возникать, когда несколько событий или действий должны произойти в одно время. Допустим, например, программа не способна рисовать картинку пока выполняет чтение нажатия клавиш. Программа должна уделять всё своё внимание клавиатуре, вследствие чего отсутствует возможность обрабатывать более одного события одновременно. Идеальным решением для этой проблемы может служить возможность выполнения двух или более разделов программы в одно время. Потоки позволяют нам это сделать.

Многопоточные приложения предоставляют мощь при запуске многих потоков в рамках одной программы. С логической точки зрения, многопоточность означает, что несколько строк из одной и той же программы могут быть выполнены в одно и то же время, однако, это не то же самое, что запустить программу дважды и сказать, что несколько строк кода выполняются в одно время. В этом случае, операционная система обрабатывает две программы раздельно и как отдельные процессы. В Unix, разветвляющий(forking) процесс создаёт дочерний процесс с разным адресным пространством для кода и данных. Вместе с тем, fork() создаёт много накладок для операционной системы, это влечёт за собой интенсивную нагрузку на процессор. При запуске потока, эффективный путь выполнения создаётся за счёт распределения исходного пространство данных родителя. Идея совместного использования данных очень выгодна, но вызывает некоторые вопросы, которые мы обсудим позже.