단일 스레드 애플리케이션에서 new ArrayList()는 일반적으로 반복 가능한 데이터를 저장하기 위해 목록 컬렉션을 지정하는 데 사용됩니다.
그러나 멀티스레딩에서는 예상치 못한 문제가 자주 발생합니다. 코드는 다음과 같습니다.
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { // 创建list集合 //List<String> lists = Arrays.asList("1", "2", "3"); // 不安全 List<String> lists = new ArrayList<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
여러 스레드가 동일한 개체 정보 모음을 작동할 때 java.util.ConcurrentModificationException 예외 오류 메시지가 자주 나타납니다.
Java 언어에서는 새로운 목록 컬렉션인 java.util.Vector 클래스가 제공됩니다. 자세한 내용은 다음 코드를 참조하세요.
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { // 创建list集合 //List<String> lists = Arrays.asList("1", "2", "3"); // 不安全 //List<String> lists = new ArrayList<>(); List<String> lists = new Vector<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
java.util.ConcurrentModificationException 오류가 발생하지 않습니다. 메시지.
왜 데이터의 안전한 운영을 보장할 수 있나요?
메소드 실행 호출자에 대해 동기화된 잠금을 채택하여 추가 작업의 다중 스레드 보안을 보장합니다!
JUC 패키지에서는 보안 컬렉션을 생성하는 다음과 같은 방법이 제공됩니다.
방법 1: Collections.synchronizedList(new ArrayList<>());
import java.util.*; public class ListTest { public static void main(String[] args) throws InterruptedException { List<String> lists = Collections.synchronizedList(new ArrayList<>()); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
기본 소스 코드를 보고 논리를 구현합니다.
수신 목록 컬렉션 유형을 판단하고 유형은 java.util.RandomAccess입니다. 그렇다면 java.util.Collections.SynchronizedRandomAccessList를 사용하여 컬렉션을 생성하고, 그렇지 않은 경우 java.util.Collections.SynchronizedList를 사용하여 컬렉션을 생성합니다.
소스 코드에서 해당 추가 작업 논리는 다음과 같습니다.
동기화된 동기화 코드 블록을 채택하여 데이터 추가 작업을 잠급니다! C 방법 2: New CopyonWriteArrayList ()
import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; public class ListTest { public static void main(String[] args) throws InterruptedException { List<String> lists = new CopyOnWriteArrayList<>(); // 开启十个线程增加数据 for (int i = 1; i <= 40; i++) { new Thread(()->{ lists.add(UUID.randomUUID().toString().substring(0,5)); System.out.println(Thread.currentThread().getName()+"=="+lists); },String.valueOf(i)).start(); } } }
분명히 논리는 다음과 같습니다.
ADD 방법을 호출한 후 , 가져가, 가져가, 가져가서 java.util.concurrent.locks.ReentrantLock 객체 정보에 ADD 메소드를 가져옵니다.위 내용은 Java JUC는 목록 보안 클래스 모음을 어떻게 운영합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!