목록 인터페이스의 가변 크기 배열 구현. 모든 선택적 목록 작업이 구현되며 NULL을 포함한 모든 요소가 허용됩니다. 이 클래스는 목록 인터페이스를 구현하는 것 외에도 내부적으로 목록을 저장하는 데 사용되는 배열의 크기를 조작하는 몇 가지 방법을 제공합니다. (이 클래스는이 클래스가 동기화되지 않는 것을 제외하고는 벡터 클래스와 거의 동일합니다.) 크기, ISEMPTY, GET, SET, IGERATOR 및 LISTITERATOR 작업은 모두 고정 된 시간에 실행됩니다. 추가 작업은 공유 고정 시간에 실행됩니다. 즉, N 요소를 추가하는 데 시간이 걸립니다. 다른 모든 작업은 선형 시간 (일반적으로)으로 실행됩니다. 이 구현은 LinkedList 구현에 사용되는 일정한 요소보다 상수 요인이 낮습니다. 각 ArrayList 인스턴스에는 용량이 있습니다. 이 용량은 목록 요소를 저장하는 데 사용되는 배열의 크기를 나타냅니다. 항상 목록의 크기와 동일합니다. 요소가 Arraylist에 지속적으로 추가되면 용량도 자동으로 증가합니다. 성장 전략의 세부 사항은 고정 시간 오버 헤드를 초래할 요소를 추가하는 것만 큼 간단하지 않기 때문에 지정되지 않습니다. 많은 수의 요소를 추가하기 전에 응용 프로그램은 ensurecapacity 작업을 사용하여 ArrayList 인스턴스의 용량을 늘릴 수 있습니다. 이렇게하면 증분 재분배 횟수가 줄어 듭니다.
이 구현은 동기식이 아닙니다.
여러 스레드가 ArrayList 인스턴스에 동시에 액세스하고 적어도 하나의 스레드가 목록을 구조적으로 수정하면 외부 동기화되어야합니다. (구조 수정은 하나 이상의 요소를 추가 또는 제거하거나 기본 배열의 크기를 명시 적으로 조정하는 모든 작업을 말합니다. 요소의 값을 설정하는 것은 구조 수정이 아닙니다.) 일반적으로 목록을 자연스럽게 캡슐화하는 개체를 동기화하여 수행됩니다. 그러한 객체가 존재하지 않으면 Collections.synchronizedList 메소드를 사용하여 목록을 "포장"해야합니다. 이는 목록에 대한 예기치 않은 액세스가 동기화되는 것을 방지하기 위해 생성 시간에 수행되는 것이 가장 좋습니다.
ListList = collections.synchronizedList (newArrayList (...));
이 클래스의 반복자 및 Listiterator 메소드에 의해 반환 된 반복기는 빠르게 실패합니다. 반복자를 작성한 후, 반복자 자체의 제거 또는 추가 메소드에 의해 목록이 구조적으로 수정되지 않는 한, ITERATOR는 언제든지 목록을 수정하는 방법과 동시 변형 외환을 던집니다. 따라서 동시 수정에 직면하여, 반복자는 미래에 불확실한 시간에 임의의 불확실한 행동을 위험에 빠뜨리지 않고 곧 완전히 실패 할 것입니다.
반복자의 빠른 고장 거동은 보장 될 수 없습니다. 일반적으로 동기가 부족한 동시 수정이 있는지 여부에 대한 어려운 보장이 불가능하기 때문입니다. 빠르게 시작된 반복자는 동시 모형화를 던지기 위해 최선을 다할 것입니다. 따라서 이러한 반복자의 정확성을 향상시키기 위해이 예외에 의존하는 프로그램을 작성하는 것은 잘못입니다. 반복자의 빠른 고장 동작은 버그를 감지하는 데만 사용해야합니다.
위에 표시된 것처럼 이제 목록 컬렉션을 작성하고 하나의 스레드가 컬렉션을 작성하고 하나의 스레드가 컬렉션을 삭제합니다.
import java.util.arraylist; import java.util.collection; import java.util.iterator; import java.util.list; import java.util.random; public class myArrayList {/*** 목록 만들기, 스레드가 쓰기를 읽습니다. 이 메소드에 의해 반환 된 반복자는 빠른다.*/public void readwrite () {list <integer> nums = new arraylist <integer> (); list <integer> synnums = collections.synchronizedlist (nums); // syncnums (syncnums). deletelistthread (syncnums) .start ();} public static void main (string [] args) {new myArrayList (). readWrite ();}} class writeListThread는 {private list <integer> nums; public writelistthread (list <integer> nums (super) ( "writestthread"); this.nums = nums;} // 요소를 계속 쓰십시오 1 public void run () {while (true) {nums.add (nums.add (new random (). nextInt (1000)); System.out.println (thread.currentThread (). getName ());}} class deletEListThread intger (problleger); nums) {super ( "deletelistthread"); this.nums = nums;} // 첫 번째 요소 public void run () {while (true) {try) {try) {try) {try)원자 연산은 목록 <integer> syncnums = collections.synchronizedList (NUMS)로 동기화 할 수 있습니다. 그러나 공식 API 예제에 의해 수동으로 동기화를 추가 해야하는 이유는 무엇입니까?
목록 목록 = collections.synchronizedList (new arrayList ()); Synchronized (list) {iterator i = list.iterator (); // (i.hasnext ()) foo (i.next ()); }소스 코드를 봅니다
synchronizedCollection (collection <e> c) {if (c == null) 새 nullpointerexception () 던지기; this.c = c; MUTEX = 이것; } import java.util.arraylist; import java.util.collection; import java.util.iterator; import java.util.list; import java.util.random; public class myArrayList {/*** 목록 만들기, 스레드가 쓰기를 읽습니다. 이 메소드에 의해 반환 된 반복자는 빠른다.*/public void readwrite () {list <integer> nums = new arraylist <integer> (); list <integer> synnums = collections.synchronizedlist (nums); // syncnums (syncnums). deletelistthread (syncnums) .start ();} public static void main (string [] args) {new myArrayList (). readWrite ();}} class writeListThread는 {private list <integer> nums; public writelistthread (list <integer> nums (super) ( "writestthread"); this.nums = nums;} // 요소를 계속 쓰십시오 1 public void run () {while (true) {nums.add (nums.add (new random (). nextInt (1000)); System.out.println (thread.currentThread (). getName ());}} class deletEListThread intger (problleger); nums) {super ( "deletelistthread"); this.nums = nums;} // 첫 번째 요소 public void run () {while (true) {try) {try) {try) {try)컬렉션 동기화 작업의 경우 동기화 래퍼 도구 컬렉션을 사용하여 컬렉션의 클래스를 사용하여 사용자는 비 원자 작업을 수동으로 동기화해야합니다.
아래와 같이, 컬렉션을 읽을 스레드를 추가하십시오.
클래스 readlistthread는 스레드 {private list <integer> nums; public readlistthread (list <integer> nums) {super ( "readlistthread"); this.nums = nums;} // 비 만족 작전을 계속 읽고 자물쇠 공개 void run () {while (true) {// 수면, 손으로 잠금 장치를 추가해야합니다. {strook.sleep (1000);} catch (InterruptedException e1) {e1.printstacktrace ();} synchronized (nums) {if (nums.size ()> 100) {iterator <integer> iter = nums.iterator (); +”:” + iter.next ()) ;;}} else {try {nums.wait (1000);} catch (InterpruptedException e) {e.printstacktrace ();}}}}}}}}}요약
위의 내용은 Java Collection Framework에 대한이 기사의 스레드 동기화 코드에 대한 자세한 설명이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!