>  기사  >  Java  >  Java JUC는 목록 보안 클래스 모음을 어떻게 운영합니까?

Java JUC는 목록 보안 클래스 모음을 어떻게 운영합니까?

WBOY
WBOY앞으로
2023-04-30 09:10:06689검색

안전하지 않은 컬렉션

단일 스레드 애플리케이션에서 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 언어에서는 새로운 목록 컬렉션인 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 오류가 발생하지 않습니다. 메시지.

왜 데이터의 안전한 운영을 보장할 수 있나요?

Java JUC怎么操作List安全类的集合

메소드 실행 호출자에 대해 동기화된 잠금을 채택하여 추가 작업의 다중 스레드 보안을 보장합니다!

JUC의 안전 목록 컬렉션

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 JUC怎么操作List安全类的集合

수신 목록 컬렉션 유형을 판단하고 유형은 java.util.RandomAccess입니다. 그렇다면 java.util.Collections.SynchronizedRandomAccessList를 사용하여 컬렉션을 생성하고, 그렇지 않은 경우 java.util.Collections.SynchronizedList를 사용하여 컬렉션을 생성합니다.

소스 코드에서 해당 추가 작업 논리는 다음과 같습니다.

Java JUC怎么操作List安全类的集合

동기화된 동기화 코드 블록을 채택하여 데이터 추가 작업을 잠급니다! C 방법 2: New CopyonWriteArrayList ()

    R
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();
        }
    }
}
  • 소스 코드의 소개는 다음과 같습니다.

  • Java JUC怎么操作List安全类的集合 분명히 논리는 다음과 같습니다.

    Java JUC怎么操作List安全类的集合

    ADD 방법을 호출한 후 , 가져가, 가져가, 가져가서 java.util.concurrent.locks.ReentrantLock 객체 정보에 ADD 메소드를 가져옵니다.

    1. lock.lock()을 호출하여 자물쇠를 얻으세요!

    2. 원래 배열 객체를 복사하고 원래 배열 크기 + 1로 새 배열을 만듭니다.

    3. 새 데이터를 새 배열에 넣습니다.

    4. 모든 작업을 수행하려면 마침내 잠금을 해제해야 합니다!

    5. 성능면에서는 JUC 패키지의 Lock 작업이 동기화 작업보다 성능이 더 좋습니다!

    위 내용은 Java JUC는 목록 보안 클래스 모음을 어떻게 운영합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제