찾다
JavaJava인터뷰 질문들Java 멀티스레딩 및 동시성 인터뷰 질문(질문 4, 답변 포함)

Java 멀티스레딩 및 동시성 인터뷰 질문(질문 4, 답변 포함)

4. ConcurrentLinkedQueue 비차단 무제한 연결 목록 큐

ConcurrentLinkedQueue는 스레드로부터 안전한 큐 기반입니다. 연결된 목록의 구조는 무한한 대기열로 구현됩니다. 이론적으로 대기열의 길이는 무한히 확장될 수 있습니다.

다른 대기열과 마찬가지로 ConcurrentLinkedQueue도 FIFO(선입선출) 대기열 추가 규칙을 사용하여 요소를 정렬합니다. (추천 연구: java 인터뷰 질문)

큐에 요소를 추가하면 새로 삽입된 요소가 큐의 끝에 삽입됩니다. 요소는 대기열의 헤드에서 가져옵니다.

ConcurrentLinkedQueue는 연결 목록 구조이기 때문에 대기열에 들어갈 때 삽입된 요소는 연결 목록을 형성하기 위해 뒤로 확장되며 대기열에서 빼면 연결 목록의 첫 번째 요소부터 시작하여 증가합니다. 시퀀스;

ConcurrentLinkedQueue를 사용할 때 대기열이 비어 있는지 여부를 판단하는 경우 size()==0을 사용하지 않는 것을 기억하세요. passed 전체 연결리스트를 순회하는 방식으로 구현되는데, queue에 요소가 많을 경우 size() 메소드는 성능과 시간을 많이 소모하므로 단순히 queue가 비어 있는지 판단하기 위해 isEmpty()를 사용하면 됩니다.

public class ConcurrentLinkedQueueTest {<br/>    public static int threadCount = 10;<br/>    public static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();<br/>    static class Offer implements Runnable {<br/>        public void run() {<br/>            //不建议使用 queue.size()==0,影响效率。可以使用!queue.isEmpty()<br/>            if (queue.size() == 0) {<br/>                String ele = new Random().nextInt(Integer.MAX_VALUE) + "";<br/>                queue.offer(ele);<br/>                System.out.println("入队元素为" + ele);<br/>            }<br/>        }<br/>    }<br/>    static class Poll implements Runnable {<br/>        public void run() {<br/>            if (!queue.isEmpty()) {<br/>                String ele = queue.poll();<br/>                System.out.println("出队元素为" + ele);<br/>            }<br/>        }<br/>    }<br/>    public static void main(String[] agrs) {<br/>        ExecutorService executorService = Executors.newFixedThreadPool(4);<br/>        for (int x = 0; x < threadCount; x++) {<br/>            executorService.submit(new Offer());<br/>            executorService.submit(new Poll());<br/>        }<br/>        executorService.shutdown();<br/>    }<br/>}<br/>

출력:

入队元素为313732926<br/>出队元素为313732926<br/>入队元素为812655435<br/>出队元素为812655435<br/>入队元素为1893079357<br/>出队元素为1893079357<br/>入队元素为1137820958<br/>出队元素为1137820958<br/>入队元素为1965962048<br/>出队元素为1965962048<br/>出队元素为685567162<br/>入队元素为685567162<br/>出队元素为1441081163<br/>入队元素为1441081163<br/>出队元素为1627184732<br/>入队元素为1627184732<br/>

ConcurrentLinkedQuere 클래스 다이어그램

# 🎜 🎜#Java 멀티스레딩 및 동시성 인터뷰 질문(질문 4, 답변 포함)

그림에 표시된 것처럼 ConcurrentLinkedQueue에는 두 개의 휘발성 노드 노드가 있으며, 이는 목록의 첫 번째 노드와 마지막 노드를 저장하는 데 사용됩니다. 연결된 목록은 null이고 꼬리 노드는 항상 마지막 노드를 가리키지 않습니다.

Node 노드는 노드의 값을 저장하기 위해 내부적으로 변수 항목을 유지하고, next는 다음 노드를 저장하는 데 사용되므로 단방향 무한 목록에 연결됩니다.

public ConcurrentLinkedQueue(){<br/>    head=tail=new Node<E>(null);<br/>}<br/>

위 코드가 초기화되면 항목이 NULL인 빈 노드가 연결리스트의 선두 노드와 꼬리 노드로 구성됩니다.

Offer 동작 Offer 동작은 연결리스트 끝에 요소를 추가하는 것인데,

구현 원리를 살펴보겠습니다.

public boolean offer(E e) {<br/>    //e 为 null 则抛出空指针异常<br/>    checkNotNull(e);<br/>    //构造 Node 节点构造函数内部调用 unsafe.putObject,后面统一讲<br/>    final Node<E> newNode = new Node<E>(e);<br/>    //从尾节点插入<br/>    for (Node<E> t = tail, p = t; ; ) {<br/>        Node<E> q = p.next;<br/>        //如果 q=null 说明 p 是尾节点则插入<br/>        if (q == null) {<br/>            //cas 插入(1)<br/>            if (p.casNext(null, newNode)) {<br/>                //cas 成功说明新增节点已经被放入链表,然后设置当前尾节点(包含 head,1,3,5.。。个节点为尾节点)<br/>                if (p != t)// hop two nodes at a time<br/>                    casTail(t, newNode); // Failure is OK. return true;<br/>            }<br/>            // Lost CAS race to another thread; re-read next<br/>        } else if (p == q)//(2)<br/>            //多线程操作时候,由于 poll 时候会把老的 head 变为自引用,然后 head 的 next 变为新 head,所以这里需要<br/>            //重新找新的 head,因为新的 head 后面的节点才是激活的节点<br/>            p = (t != (t = tail)) ? t : head;<br/>        else<br/>            // 寻找尾节点(3)<br/>            p = (p != t && t != (t = tail)) ? t : q;<br/>    }<br/>}<br/>

생성자에서 우리는 시작 부분에 null 항목이 있는 sentinel 노드가 있고 헤드와 테일 모두 이 노드를 가리킨다는 것을 알고 있습니다.

위 내용은 Java 멀티스레딩 및 동시성 인터뷰 질문(질문 4, 답변 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.