한 스레드에서 arraylist를 반복하고 다른 스레드에서 추가하는 방법은 무엇입니까?

마틴 크나 즈코

ArrayList다른 스레드에서 추가하는 동안 한 스레드에서 반복하는 방법은 무엇입니까?

1) 루프를 통해 ArrayList몇 가지 검사를 수행 하는 스레드가 하나 있습니다.

2) 끝에 추가하는 두 번째 스레드가 ArrayList있습니다.

두 번째가 실행 중일 때 첫 번째 스레드를 일시 중지하는 세마포어가 있지만 어떻게 구현합니까?

두 번째 스레드가에 무언가를 추가 할 때 ArrayList첫 번째 스레드는 던지지 않고 일시 중지 된 지점에서 루프를 계속합니다 java.util.ConcurrentModificationException.

제럴드 뮈케

당신가를 사용하는 바인딩하는 경우 ArrayList당신은 할 필요가 그에 대한 액세스를 동기화 할 수 있습니다. 그러나 이것이 반드시 동시성과 관련이있는 것은 아니기 때문에 ConcurrentModificationExeptions에서 당신을 구할 수는 없습니다.

에서 의 JavaDoc

이 예외가 항상 다른 스레드에 의해 객체가 동시에 수정되었음을 나타내는 것은 아닙니다. 단일 스레드가 개체의 계약을 위반하는 일련의 메서드 호출을 발행하면 개체가이 예외를 throw 할 수 있습니다. 예를 들어 스레드가 fail-fast iterator를 사용하여 컬렉션을 반복하는 동안 컬렉션을 직접 수정하면 반복기가이 예외를 throw합니다.

보장 할 수있는 경우 새 항목 만 목록에 추가되고 인덱스를 사용하고 반복자를 사용하지 않고 수동으로 반복 할 수 있습니다. 대기열 끝에 도달하면 처음부터 다시 시작합니다.

ArrayList q = new ArrayList<>();

//thread 1    
Object o = ...;
synchronized(q) {
  q.add(o); //append
}

//thread 2
int i = 0;
synchronized(q) {
  int size = q.size();
  for(; i < size; i++){
    Object o = q.get(i);
    //do something with o
  }
  if(i >= size) {
    i = 0;
  }
}

그러나 그렇게하면 하나 또는 다른 스레드가 목록에서 한 번에 작동 할 수 있으므로 다소 순차적 인 동작으로 이어질 것입니다. 유일한 "장점"은 스레딩 모델이 루프 작업에 임의성을 추가한다는 것입니다. 따라서 동기화 및 동시성을 건너 뛰고

q.add(o); //append 
//you may add a random condition, i.e. time interval, item count random number to trigger the loop process so it don't get exectued on each add
for(Object o : q){
  //do something with o 
}

물론 Nicolas가 작성한 것처럼 Safe-Copy를 사용할 수 있지만 이는 내용이 아닌 컨테이너 구조 (목록)의 얕은 복사본 일뿐입니다. 따라서 그렇게 할 경우 항목이 스레드로부터 안전한지 확인하거나 수정하지 마십시오.

두 번째 스레드가 때때로 목록 끝에서 항목을 제거하는 경우 대기열을 사용하는 것이 좋습니다. Java가이를 제공합니다 Deque. 한 스레드는 한쪽 끝에 요소를 추가하고 다른 스레드는 다른 쪽에서 제거 할 수 있습니다. 여러 스레드에서 사용하고 수동으로 동기화하면 스레드 안전 구현을 사용하고 동기화를 건너 뛰는 것이 좋습니다.

Deque q = new ConcurrentLinkedDeque<>();

//thread 1    
Object o = ...;
q.addFirst(o);

//thread 2
while(!q.isEmpty()){
    Object o = q.removeLast();
   //do something with o
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

한 스레드에서 변수를 수정하고 다른 스레드에서 확인하는 방법은 무엇입니까?

분류에서Dev

다른 스레드가 visualC #에서 작동하는 동안 한 스레드를 잠자는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 다른 스레드로 메시지 (C)를 보내는 방법은 무엇입니까?

분류에서Dev

다른 스레드 중에서 특정 스레드를 중지하는 방법은 무엇입니까?

분류에서Dev

다른 스레드에서 동일한 클래스의 다른 메서드를 실행하는 방법은 무엇입니까?

분류에서Dev

이 다중 스레드 상황에서 깨끗한 코드를 작성하는 방법은 무엇입니까?

분류에서Dev

다른 메서드를 호출하여 한 개체의 메서드에서 스레드를 시작하는 방법은 무엇입니까?

분류에서Dev

한 스레드에서 다른 스레드를 중지하는 데 동기화 된 방법의 중요성은 무엇입니까?

분류에서Dev

다른 스레드에서 메서드를 호출하는 방법은 무엇입니까?

분류에서Dev

한 div에 클래스를 추가하고 다른 div에서 제거하는 방법은 무엇입니까?

분류에서Dev

한 스레드가 다른 스레드를 기다리게하는 방법은 무엇입니까?

분류에서Dev

함수를 받고 스레드에 대한 핸들을 반환하는 다른 함수를 반환하는 함수의 형식 서명은 무엇입니까?

분류에서Dev

한 테이블에서 다른 테이블로 레코드를 삽입하는 방법은 무엇입니까?

분류에서Dev

asmx 웹 서비스에서 데이터베이스 IO에 대한 스레드를 생성하는 올바른 방법은 무엇입니까?

분류에서Dev

다른 스레드 그룹에 다른 수의 스레드를 설정하는 방법은 무엇입니까?

분류에서Dev

한 서버의 파일에서 텍스트를 복사하고 ssh를 사용하여 다른 파일에 추가하는 방법은 무엇입니까?

분류에서Dev

다른 스레드에서 java.util.logging.Logger를 사용하는 방법은 무엇입니까?

분류에서Dev

다중 스레드 환경에서 ZMQ를 사용하는 올바른 방법은 무엇입니까?

분류에서Dev

스프레드 시트 끝에서 복사 한 시트를 이동하는 방법은 무엇입니까?

분류에서Dev

장고 템플릿에서 한 인덱스에서 다른 인덱스로 변수를 반복하는 방법은 무엇입니까?

분류에서Dev

어떻게 다른 스레드에서 하나 개의 스레드에 대기열을 추가하는 방법은 무엇입니까?

분류에서Dev

Jmeter-모든 슬레이브에서 주 스레드를 종료 한 후에 만 스레드 그룹을 해제하는 방법은 무엇입니까?

분류에서Dev

스레드에서 psycopg2 커서를 사용하는 올바른 방법은 무엇입니까?

분류에서Dev

스레드 중 하나가 실패 할 때 다중 스레드 프로그램에서 종료 코드를 결정하는 방법은 무엇입니까?

분류에서Dev

다중 스레드를 위해 C에서 뮤텍스를 사용하는 방법은 무엇입니까?

분류에서Dev

다른 스레드의 정적 메서드에서 텍스트 상자의 텍스트를 변경하는 방법은 무엇입니까?

분류에서Dev

EXT JS : Combobox에서 스토어에없는 레코드에 대한 디스플레이 필드를 설정하는 방법은 무엇입니까?

분류에서Dev

파이썬에서 타이머 스레드를 종료하는 적절한 방법은 무엇입니까?

분류에서Dev

`init`에서 스레드로부터 안전한 변수를 초기화하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    한 스레드에서 변수를 수정하고 다른 스레드에서 확인하는 방법은 무엇입니까?

  2. 2

    다른 스레드가 visualC #에서 작동하는 동안 한 스레드를 잠자는 방법은 무엇입니까?

  3. 3

    한 스레드에서 다른 스레드로 메시지 (C)를 보내는 방법은 무엇입니까?

  4. 4

    다른 스레드 중에서 특정 스레드를 중지하는 방법은 무엇입니까?

  5. 5

    다른 스레드에서 동일한 클래스의 다른 메서드를 실행하는 방법은 무엇입니까?

  6. 6

    이 다중 스레드 상황에서 깨끗한 코드를 작성하는 방법은 무엇입니까?

  7. 7

    다른 메서드를 호출하여 한 개체의 메서드에서 스레드를 시작하는 방법은 무엇입니까?

  8. 8

    한 스레드에서 다른 스레드를 중지하는 데 동기화 된 방법의 중요성은 무엇입니까?

  9. 9

    다른 스레드에서 메서드를 호출하는 방법은 무엇입니까?

  10. 10

    한 div에 클래스를 추가하고 다른 div에서 제거하는 방법은 무엇입니까?

  11. 11

    한 스레드가 다른 스레드를 기다리게하는 방법은 무엇입니까?

  12. 12

    함수를 받고 스레드에 대한 핸들을 반환하는 다른 함수를 반환하는 함수의 형식 서명은 무엇입니까?

  13. 13

    한 테이블에서 다른 테이블로 레코드를 삽입하는 방법은 무엇입니까?

  14. 14

    asmx 웹 서비스에서 데이터베이스 IO에 대한 스레드를 생성하는 올바른 방법은 무엇입니까?

  15. 15

    다른 스레드 그룹에 다른 수의 스레드를 설정하는 방법은 무엇입니까?

  16. 16

    한 서버의 파일에서 텍스트를 복사하고 ssh를 사용하여 다른 파일에 추가하는 방법은 무엇입니까?

  17. 17

    다른 스레드에서 java.util.logging.Logger를 사용하는 방법은 무엇입니까?

  18. 18

    다중 스레드 환경에서 ZMQ를 사용하는 올바른 방법은 무엇입니까?

  19. 19

    스프레드 시트 끝에서 복사 한 시트를 이동하는 방법은 무엇입니까?

  20. 20

    장고 템플릿에서 한 인덱스에서 다른 인덱스로 변수를 반복하는 방법은 무엇입니까?

  21. 21

    어떻게 다른 스레드에서 하나 개의 스레드에 대기열을 추가하는 방법은 무엇입니까?

  22. 22

    Jmeter-모든 슬레이브에서 주 스레드를 종료 한 후에 만 스레드 그룹을 해제하는 방법은 무엇입니까?

  23. 23

    스레드에서 psycopg2 커서를 사용하는 올바른 방법은 무엇입니까?

  24. 24

    스레드 중 하나가 실패 할 때 다중 스레드 프로그램에서 종료 코드를 결정하는 방법은 무엇입니까?

  25. 25

    다중 스레드를 위해 C에서 뮤텍스를 사용하는 방법은 무엇입니까?

  26. 26

    다른 스레드의 정적 메서드에서 텍스트 상자의 텍스트를 변경하는 방법은 무엇입니까?

  27. 27

    EXT JS : Combobox에서 스토어에없는 레코드에 대한 디스플레이 필드를 설정하는 방법은 무엇입니까?

  28. 28

    파이썬에서 타이머 스레드를 종료하는 적절한 방법은 무엇입니까?

  29. 29

    `init`에서 스레드로부터 안전한 변수를 초기화하는 방법은 무엇입니까?

뜨겁다태그

보관