스레드 안전하지 않음:
스레드 안전성은 다중 스레드에 액세스할 때 잠금 메커니즘이 사용된다는 의미입니다. 스레드가 이 클래스의 특정 데이터에 액세스하면 해당 데이터가 보호되고 스레드가 이를 읽을 때까지 다른 스레드가 액세스할 수 없습니다. . 완료되었으므로 다른 스레드를 사용할 수 있습니다. 데이터 불일치나 데이터 오염이 발생하지 않습니다. 스레드 불안정성은 데이터 액세스 보호가 제공되지 않음을 의미합니다. 여러 스레드가 데이터를 연속적으로 변경하여 얻은 데이터가 더티 데이터가 될 수 있습니다.
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 스레드는 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!