SynchronousQueue를 이해하려면 먼저 해당 클래스의 기능을 알아야 합니다. 이 클래스의 목적과 제공하는 기능을 알아야만 소스 코드를 읽을 때 헤매지 않을 수 있습니다.
이전 연구에서 스레드가 데이터를 교환하려는 경우 일반적으로 공개 변수 또는 동기식 차단 대기열을 사용합니다. 생산자 스레드는 변수를 설정하거나 값을 대기열에 넣고 소비자 스레드는 변수를 읽거나 가져옵니다. 대기열에서.
SynchronousQueue는 스레드 간에 교환되는 데이터를 저장할 필요가 없으며 생산자와 소비자를 하나씩 일치시키는 일치자처럼 작동합니다.
예를 들어 스레드가 put 메소드를 호출하고 대기열에 take 스레드가 없음을 발견하면 take 스레드가 들어와서 take 스레드가 있음을 발견하면 차단됩니다. Put 스레드가 차단된 경우 두 스레드가 일치하고 Take 스레드가 Put 스레드의 데이터를 가져오며 두 스레드 모두 차단되지 않습니다.
반대로 스레드가 take 메서드를 호출하면 put 메서드를 호출하는 스레드가 들어오면 스레드도 차단됩니다.
take 또는 put 스레드가 들어와 동일한 유형의 take 또는 put 스레드가 차단된 것을 발견하면 해당 스레드는 다른 유형의 스레드가 들어와 스레드 중 하나와 일치할 때까지 뒤쪽의 대기열에 대기하게 됩니다. .
프로세스 설명을 통해 동기식 대기열에 대해 어느 정도 이해하고 있으며 동기식 대기열이 요소를 저장할 필요가 없는 이유도 알게 되었다고 믿습니다.
SynchronousQueue의 take 및 put 메소드를 살펴보면 둘 다 속성 전송자의 전송 메소드라고 하며 전송자 속성은 동기식 대기열의 추상 정적 내부 클래스 전송자임을 알 수 있습니다. . Transferer에는 TransferQueue와 TransferStack이라는 두 개의 하위 클래스가 있습니다.
SynchronousQueue 생성자 메서드에서 전달된 매개변수 fair는 TransferQueue 또는 TransferStack을 생성할지 여부를 결정하는 데 사용됩니다. 매개변수 fair에 따라 TransferQueue는 공정 모드에 있어야 하며, TransferStack은 비 모드입니다. -기능 모드.
우선 내부 클래스인 QNode를 가지고 있습니다. 위의 분석을 통해 다수의 Consumer 또는 다수의 생산자가 있을 수 있으며 이들이 큐를 형성하게 되며 QNode를 사용하게 됩니다. 연결리스트를 구성합니다.
QNode에는 주로 네 가지 속성이 있습니다.
QNode next: 다음 노드를 나타냅니다.
여기에 있는 개체 항목은 실제로 put 데이터이며, take 메서드에 의해 생성된 노드는 일반적으로 스레드 대기자입니다. 이 노드를 생성하는 스레드는 차단되고 데이터를 가져온 후 다른 스레드가 깨어납니다.
boolean isData: true는 put에 의해 생성됨을 의미하고, false는 take에 의해 생성됨을 의미합니다. 전송 방법, 그러면 전송 구현을 살펴보겠습니다. 소스 코드가 너무 길어서 게시하지 않겠습니다. 요약된 흐름도만 살펴보겠습니다.
이 방법은 잠금을 사용하지 않기 때문입니다. 컨트롤, 전체 프로세스에는 여전히 많은 판단이 있습니다. 이것들은 모두 사소한 것이며 여기에 주요 프로세스와 핵심 프로세스가 구성되어 있습니다.
간단히 설명하자면, QNode의 isData는 take 방식과 put 방식을 구분합니다. 연결 리스트에 있는 노드의 isData는 동일해야 합니다.
QNode의 항목은 교환되는 데이터입니다. take 및 put 스레드에 의해 수행되지만 take 메소드로 교환된 데이터는 null입니다.
매번 일치할 때마다 프런트 노드를 가져와 데이터를 반환하는 것을 볼 수 있습니다.
Unfair 모드 TransferStackSNode 일치:
성공적으로 일치한 노드. it;
스레드 웨이터: 차단된 스레드; 객체 항목: 제공할 값
int 모드: 노드 분류, 전송의 소스 코드 흐름도를 다음과 같이 구성합니다. 아래와 같습니다.
연결된 목록을 사용하여 구현되지만 이 첫 번째 구조는 일치하는 노드를 나타내는 추가 일치 항목이 있습니다. 과정을 통해 mode에는 0과 1 외에 일치하는 노드를 나타내는 2도 있다는 것을 알 수 있습니다. 주로 위 그림의 빨간색 상자 부분에서
헤드 노드가 진행 중이 아닌 것을 발견하면 현재 스레드는 일치하는 노드를 생성한 다음 이를 헤드에 추가하고 마지막으로 다음 노드 와 일치시킵니다.
일치하는 항목이 발견되면 일치하는 노드가 연결 목록에서 제거됩니다.
프로세스 분석을 통해 TransferStack이 나중에 들어오는 스레드의 선두에 배치되어 가장 먼저 매칭되는 것을 알 수 있습니다.
위 내용은 Java의 동기 대기열이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!