Реализация массивов размеров переменных интерфейса списка. Все дополнительные операции списка реализованы, и все элементы, включая NULL, разрешены. В дополнение к реализации интерфейса списка, этот класс также предоставляет некоторые методы для манипулирования размером массива, используемого для хранения списка внутри. (Этот класс примерно эквивалентен векторному классу, за исключением того, что этот класс не синхронизировал.) Размер, Isempty, Get, Set, итератор и операции ListIterator все работают в фиксированное время. Операция добавления работает в общее фиксированное время, то есть добавление n -элементов занимает время (n). Все остальные операции работают в линейное время (в целом). Эта реализация имеет более низкий постоянный коэффициент, чем постоянный коэффициент, используемый для реализации LinkedList. Каждый экземпляр ArrayList имеет емкость. Эта емкость относится к размеру массива, используемого для хранения списков элементов. Это всегда, по крайней мере, равно размеру списка. Поскольку элементы постоянно добавляются в ArrayList, их емкость также увеличивается автоматически. Детали стратегии роста не указаны, потому что она не так просто, как добавление элементов, которые приведут к фиксированному накладным расходам. Перед добавлением большого количества элементов приложение может использовать операцию EncureCapacty для увеличения емкости экземпляра ArrayList. Это может уменьшить количество постепенных перераспределений.
Обратите внимание, что эта реализация не является синхронной.
Если несколько потоков получают доступ к экземпляру ArrayList одновременно, и, по крайней мере, один из потоков структурно изменяет список, он должен оставаться внешне синхронизированным. (Структурная модификация относится к любой операции добавления или удаления одного или нескольких элементов или явного регулировки размера базового массива; установка значения элемента не является структурной модификацией.) Это обычно делается путем синхронизации объектов, которые естественным образом инкапсулируют список. Если такого объекта не существует, список должен быть «обернут» с использованием метода Collections.synchronizedList. Это лучше всего сделано во время создания, чтобы предотвратить неожиданный доступ к синхронизации списка:
ListList = collections.synchronizedlist (newarraylist (...));
Итератор, возвращаемый методами итератора и списков в этом классе, быстро выходит из строя: после создания итератора, если список не будет изменен из структурного метода итератора собственным методом удаления или добавления в любое время и любые способы изменения списка. Следовательно, перед лицом параллельных модификаций, итератор скоро потерпит неудачу, а не рискует произвольным неопределенным поведением в какое -то неопределенное время в будущем.
Обратите внимание, что быстрое поведение итератора не может быть гарантировано, потому что, как правило, невозможно сделать какие-либо жесткие гарантии, существует ли вне синхронная одновременная модификация. Быстрое итератор сделает все возможное, чтобы бросить condurentmodificationException. Следовательно, неправильно писать программу, которая зависит от этого исключения, чтобы улучшить правильность таких итераторов: поведение итератора быстрого отказа следует использовать только для обнаружения ошибок.
Как показано выше, теперь создайте коллекцию списков, одна ветка пишет коллекцию, а одна ветка удаляет коллекцию
Импорт java.util.arraylist; import java.util.collections; import java.util.iterator; import java.util.list; import java.util.random; открытый класс myarraylist {/*** Создать список, ветка, а поток гласит методы итератора и списка. Итератор, возвращаемый методом, быстр.*/Public void readwrite () {list <Integer> nums = new ArrayList <Integer> (); List <Integer> synnums = collections.synchronizedlist (nums); // Начало нить записи New WriteListThread (syncnum). Deletelistthread (syncnums) .start ();} public static void main (string [] args) {new myarraylist (). Readwrite ();}} класс WriteListThread Extends {private list <Integer> nums; public writeListThread (список <Integer> nums) {super ("writelThread"); this.nums = nums;} // продолжайте писать элемент 1 public void run () {while (true) {nums.add (new random (). nextint (1000)); System.out.println (Thread.currentThread (). getName ());}}} classeListThrethred Extends {private (inte neflecter> numbrete numbrete uplectre -numbrete ubletrither upubliceRege ubletreteReeRegeReeRege ubletre -ntureteReeRege upubliceReeREREDERTHTHREADS nums) {super ("deletelistthread"); this.nums = nums;} // удалить первый элемент public void run () {while (true) {try {System.out.println (Thread.currentThread (). getName ()+":"+nums.Remove (0);Атомные операции могут быть синхронизированы с помощью списка <Integer> syncnums = collections.synchronizedlist (nums); Но почему вам нужно вручную добавлять синхронизацию официальным примером API?
List List = Collections.synchronizedList (new ArrayList ()); синхронизированный (список) {итератор i = list.iterator (); // должен быть в синхронизированном блоке, в то время как (i.hasNext ()) foo (i.next ()); }Посмотреть исходный код сбора. SynchronizedList
SynchronizedCollection (collection <e> c) {if (c == null) бросить новый nullpointerexception (); this.c = c; mutex = это; } Импорт java.util.arraylist; import java.util.collections; import java.util.iterator; import java.util.list; import java.util.random; открытый класс myarraylist {/*** Создать список, ветка, а поток гласит методы итератора и списка. Итератор, возвращаемый методом, быстр.*/Public void readwrite () {list <Integer> nums = new ArrayList <Integer> (); List <Integer> synnums = collections.synchronizedlist (nums); // Начало нить записи New WriteListThread (syncnum). Deletelistthread (syncnums) .start ();} public static void main (string [] args) {new myarraylist (). Readwrite ();}} класс WriteListThread Extends {private list <Integer> nums; public writeListThread (список <Integer> nums) {super ("writelThread"); this.nums = nums;} // продолжайте писать элемент 1 public void run () {while (true) {nums.add (new random (). nextint (1000)); System.out.println (Thread.currentThread (). getName ());}}} classeListThrethred Extends {private (inte neflecter> numbrete numbrete uplectre -numbrete ubletrither upubliceRege ubletreteReeRegeReeRege ubletre -ntureteReeRege upubliceReeREREDERTHTHREADS nums) {super ("deletelistthread"); this.nums = nums;} // удалить первый элемент public void run () {while (true) {try {System.out.println (Thread.currentThread (). getName ()+":"+nums.Remove (0);Можно видеть, что для операций сборов синхронизации, используя класс коллекций инструмента синхронизации обертки, пользователям необходимо вручную синхронизировать неатомические операции.
Как показано ниже, добавьте поток, чтобы прочитать коллекцию
класс readlistthread extends thread {private list <integer> nums; public readlistthread (list <Integer> nums) {super ("readlistthread"); this.nums = nums;} // продолжать читать элементы и неатомные операции {Thread.sleep (1000);} catch (прерывание E1) {e1.printstackTrace ();} synchronized (nums) {if (nums.size ()> 100) {iterator <Integer> iter = nums.iterator (); + ”:” + Iter.next ()) ;;}} else {try {nums.wait (1000);} catch (прерывание Exception e) {e.printStackTrace ();}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Суммировать
Выше приведено все подробное объяснение кода синхронизации потоков этой статьи о структуре коллекции Java, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!