#천봉역전반, 주총 3.14#

12711 단어
고급 다중 스레드
스레드 풀
개념:
  • 스레드 용기, 스레드 분배 수량 상한선을 설정할 수 있습니다.
  • 미리 만들어진 루트 대상을 탱크에 저장하고 탱크의 루트 대상을 다시 사용합니다.
  • 자주 생성되거나 폐기되는 것을 방지합니다.
  • 임무를 스레드 탱크에 제출하고 스레드 탱크에서 스레드를 분배하고 임무를 운행하며 현재 스레드가 끝난 후에 다시 스레드를 복원한다.

  • 스레드 풀을 가져오려면:
  • 상용 스레드 탱크 인터페이스와 클래스: (패키지 자바.util.concurrent)
  • Executor: 스레드 풀의 최상위 인터페이스
  • ExecutotService: 스레드 풀 인터페이스로 방법submit(Runnable task)을 통해 작업 코드를 제출할 수 있습니다.
  • Executors 공장 종류: 이런 것을 통해 하나의 스레드 탱크를 얻을 수 있다.newFixedThreadPool(int nThread)을 통해 고정된 수량의 스레드 풀을 가져옵니다.newCachedThreadPool()을 통해 동적 수량의 스레드 풀을 얻을 수 있으며, 충분하지 않으면 새로운 스레드 풀을 만들 수 있습니다. 상한선이 없습니다(Integer.MAX VALUE)
  • Callable 커넥터
    	public interface Callable<V>{
         
    		public V call() throws Exception;
    	}
    

    Runnable 인터페이스와 유사하며 실행 가능한 작업을 선언합니다.그러나 Callable에는 일반 반환 값이 있고 예외를 선언할 수 있습니다.
    Future 인터페이스
  • 개념: 비동기 수신 Exception 서비스.submit () 가 되돌아오는 상태 결과,call 방법의 되돌아오는 값이 포함되어 있습니다.
  • Future<Integer> result1 = es.submit(task1);
    
  • 방법: V get()은Future의 비동기 처리 결과(call()의 반환값을 막는 형식으로 기다린다
  • Integer value1 = result1.get();
    

    동기식 및 비동기식:
  • 동기화: 한 번의 방법이 호출되고 동기화가 시작되면 호출자는 이 방법이 되돌아오기를 기다려야 계속할 수 있다.(단일 실행 경로)
  • 비동기: 한 번의 방법이 호출되고 비동기가 일단 시작되면 마치 한 번의 메시지 전달처럼 호출자가 알려주면 바로 되돌아온다. 양자는 시간영화를 경쟁하고 동시에 집행한다.(다중 실행 경로)
  • Lock 커넥터
  • 일반적인 방법
  • void lock(); // , , 。
    boolean tryLock()//  ( true  false  )
    void unlock // 
    

    Lock 인터페이스의 구현 클래스인 LoentrantLock을 다시 잠급니다. 선언:
    Lock lock =new ReentrantLock();// 
    
  • 참고:
  • Lock을 사용하려면 자물쇠를 명확하게 쓰고 풀어야 합니다!
  • 자물쇠를 받은 라인이 운행 기간에 이상이 발생하여 프로그램이 종료되는 것을 피하기 위해 자물쇠를 풀지 않았습니다!try{}finally{}를 사용하면 정확하게 실행하든 안 하든 최종적으로 자물쇠를 풀 수 있습니다!

  • 읽기 및 쓰기 자물쇠
  • ReentrantReadWriteLock은 Lock 인터페이스의 실현 클래스가 아닙니다. Lock 인터페이스로 이 클래스의 대상을 가리킬 수 없습니다. 이것은 쓰기와 쓰기를 지원하는 동기화 자물쇠입니다. 읽기와 쓰기가 분리되어 각각 읽기 자물쇠, 쓰기 자물쇠를 분배할 수 있습니다.여러 읽기 잠금을 여러 번 할당하여 동시에 실행할 수 있도록 지원
  • 주장:
  • ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
    // : 
    ReadLock readLock=lock.readLock();// 
    WriteLock writelock=lock.writeLock();// 
    
  • 상호 배척 규칙: 쓰기-쓰기: 서로 배척하고 막고 읽기-쓰기: 서로 배척하지 않고 막히지 않고 읽기-읽기: 서로 배척하지 않고 막히지 않는다
  • Collections의 도구 방법
  • 라인 안전 집합을 획득하는 방법:
  • public static <T> Collection<T> synchronizedCollection(Collection<T> c)
    public static <T> List<T> synchronizedList(List<T> list)
    public static <T> Set<T> synchronizedSet(Set<T> s)
    public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
    public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
    public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
    

    인터페이스가 통일되고 유지보수성이 높지만 성능이 향상되지 않아서synchronized로 실현되었다
    CopyOnWriteArrayList
  • 안전한 라인의 Array List로 판독과 쓰기의 분리를 강화합니다.(읽기와 쓰기가 서로 다르지 않음)
  • 자물쇠가 적혀 있고 읽기에 자물쇠가 없으며 읽기와 쓰기 사이가 막히지 않아 독서 자물쇠보다 우수하다.기록할 때, 용기 복사본을 복사한 다음, 편지 요소를 추가하고, 마지막으로 인용을 대체합니다.ArrayList와 동일한 방식으로 작동합니다.
  • 내부 프로세스: 쓰기 작업에 자물쇠가 있어서 매번 쓰기를 할 때마다 밑바닥 그룹을 복제했다. 새 그룹을 쓴 다음에 값을 부여한 후에 새 그룹을 낡은 그룹으로 교체하고 호출할 때마다 밑바닥 방법은 한 번 확장한다.읽기 동작을 잠그지 않고 읽는 것은 쓰기 작업이 끝나기 전의 낡은 그룹을 다 쓴 후에야 읽을 수 있는 새 그룹의 새 값입니다.

  • CopyOnWriteArraySet
  • 라인이 안전한 Set, 밑바닥은 CopyOnWriteArrayList로 이루어집니다.
  • 쓰기 표면에는dd 방법을 사용하고 밑바닥은CopyOnWriteArrayList의addIfAbsent()를 사용하여 삽입할 새 값이 존재하는지 판단합니다.
  • 원소가 존재하면 추가하지 않습니다(던전 버리기).

  • ConcurrentHashMap
  • 초기 용량 기본 16세그먼트(Segment), 세그먼트 잠금 디자인을 사용합니다.
  • 전체 맵에 자물쇠를 채우지 않고 각각의 Segment에 자물쇠를 채웁니다(자물쇠는 헤더 대상입니다).
  • 여러 객체가 동일한 Segment에 저장될 때 상호 배척이 필요합니다.
  • 가장 이상적인 상태는 16개의 대상이 각각 16개의 Segment에 저장되고 병렬 수량은 16이다.
  • 사용 방식은 해시맵과 다름없다.

  • Queue 커넥터(대기열)
  • Collection 하위 인터페이스, 대기열 FIFO(First In First Out)
  • 상용 방법: 이상 던지기:
  • boolean add(E e)// ( , )
    E remove()// ( , )
    E element()// ( , )
    

    특수값 반환: (권장)
    boolean offer(E e)// ( , false)
    E poll()// ( , null)
    E keep() // ( , null)
    

    ConcurrentLinkedQueue
  • 라인이 안전하고 효율적으로 읽기와 쓰기가 가능한 대기열로 성능이 가장 좋은 대기열을 보냅니다.
  • 잠금 없음, CAS 비교 교환 알고리즘, 수정 방법은 세 가지 핵심 매개 변수(V, E, N)를 포함한다.
  • V: 업데이트할 변수 E: 예상 값 N: 새 값.
  • V=E일 때만 V=N;그렇지 않으면 업데이트되었음을 표시하고 현재 작업을 취소합니다.

  • BlockingQueue 인터페이스(대기열 차단)
  • Queue의 하위 인터페이스, 막힌 대기열, 두 개의 스레드 상태를 무기한 대기하는 방법을 추가했습니다.
  • 방법:
  • void put(E e) // , , 
    E take() // , , 
    
  • 생산자, 소비자 문제 해결에 사용
  • 막힌 대기열의 두 가지 실현 유형:
  • ArrayBlockingQueue: 그룹 구조가 실현되고 경계 대기열이 있습니다.(수동 고정 상한)
  • 	BlockingQueue<T> abq=new ArrayBlockingQueue<T>(10);//( )
    
  • Linked BlockingQueue: 체인 테이블 구조 실현, 무계 대기열.(기본 상한 Integer.MAX VALUE)
  • 	BlockingQueue<T> lbq=new LinkedBlockingQueue<T>();
    

    좋은 웹페이지 즐겨찾기