>  기사  >  Java  >  arraylist 스레드는 안전합니까?

arraylist 스레드는 안전합니까?

(*-*)浩
(*-*)浩원래의
2019-06-05 11:58:4311044검색

스레드 안전하지 않음:

스레드 안전성은 다중 스레드에 액세스할 때 잠금 메커니즘이 사용된다는 의미입니다. 스레드가 이 클래스의 특정 데이터에 액세스하면 해당 데이터가 보호되고 스레드가 이를 읽을 때까지 다른 스레드가 액세스할 수 없습니다. . 완료되었으므로 다른 스레드를 사용할 수 있습니다. 데이터 불일치나 데이터 오염이 발생하지 않습니다. 스레드 불안정성은 데이터 액세스 보호가 제공되지 않음을 의미합니다. 여러 스레드가 데이터를 연속적으로 변경하여 얻은 데이터가 더티 데이터가 될 수 있습니다.

arraylist 스레드는 안전합니까?

ArrayList는 요소를 추가할 때 다음 두 단계로 완료될 수 있습니다.

1. 이 요소를 Items[Size] 위치에 저장합니다.

2. (추천 학습: Java 비디오 튜토리얼)

단일 스레드 작업의 경우 Size = 0이면 요소를 추가한 후 해당 요소는 위치 0에 있고 Size=1이면

; 다중 스레드, 예를 들어 두 개의 스레드가 있는 경우 스레드 A는 먼저 위치 0에 요소를 저장합니다. 그러나 이때 CPU는 스레드 A를 일시 중지하도록 예약하고 스레드 B가 실행될 기회를 얻습니다. 스레드 B도 이 ArrayList에 요소를 추가합니다. 왜냐하면 Size는 현재 여전히 0이기 때문입니다(요소를 추가하려면 두 단계가 필요하고 스레드 A는 1단계만 완료했다고 가정합니다). 따라서 스레드 B도 Stored at에 요소를 추가합니다. 위치 0. 그런 다음 스레드 A와 스레드 B가 모두 계속 실행되어 둘 다 Size 값이 증가합니다.

자, 이제 ArrayList의 상황을 살펴보겠습니다. 실제로는 위치 0에 요소가 하나만 저장되어 있지만 크기는 2입니다. 이것은 "안전하지 않은 스레드"입니다.

샘플 프로그램:

package test;
 
importjava.util.ArrayList;
 
import java.util.List;
public class ArrayListInThread implements Runnable{
    List<String> list1 = new ArrayList<String>();// not thread safe
    publicvoid run() {
        try {
           Thread.sleep((int)(Math.random() * 2));
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        list1.add(Thread.currentThread().getName());
    }
    public static void main(String[] args) throws InterruptedException {
        ThreadGroup group = new ThreadGroup("mygroup");
        ArrayListInThread t = new ArrayListInThread();
        for (int i = 0; i < 10000; i++) {
            Thread th = new Thread(group, t,String.valueOf(i));
            th.start();
        }
        while (group.activeCount() > 0) {
            Thread.sleep(10);
        }
        System.out.println();
        System.out.println(t.list1.size()); // it should be 10000 if thread safecollection is used.
    }
}

스레드 불안을 해결하는 방법은 무엇입니까?

One: 모두가 익숙할 동기화 키워드를 사용하므로 설명하지 않겠습니다.

둘: Collections.synchronizedList()를 사용합니다.

만약 코드를 작성하면 List 변경, 사용 방법은 ArrayList와 거의 동일합니다. api 문서를 참조하세요. 배울 수 있는 Tutorial

칼럼!

위 내용은 arraylist 스레드는 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.