BonecP 소스 - BonecP에 사용되는 대기열

3622 단어 bonecp
BonecP에서 연결 대상을 저장하는 대기열은 TransferQueue입니다. 이 인터페이스는 jsr166y의 인터페이스이고 BlockingQueue를 계승합니다.
TransferQueue<ConnectionHandle> connectionHandles;

public interface TransferQueue<E> extends BlockingQueue<E> {
}
if (config.getMaxConnectionsPerPartition() == config.getMinConnectionsPerPartition()){
				// if we have a pool that we don't want resized, make it even faster by ignoring
				// the size constraints.
				connectionHandles = queueLIFO ? new LIFOQueue<ConnectionHandle>() :  new LinkedTransferQueue<ConnectionHandle>();
			} else {
				connectionHandles = queueLIFO ? new LIFOQueue<ConnectionHandle>(this.config.getMaxConnectionsPerPartition()) : new BoundedLinkedTransferQueue<ConnectionHandle>(this.config.getMaxConnectionsPerPartition());
			}

queueLIFO가 설정되어 있으면 LIFOQueue 대기열을 사용하고 이 대기열은 LinkedBlockingDeque를 계승합니다.
public class LIFOQueue<E> extends LinkedBlockingDeque<E> implements TransferQueue<E>{

}

FIFOQueue는 부류의 API를 빌려 TransferQueue 인터페이스를 실현하고 해당하는 방법을 다시 써서 FIFO 대기열에서 LIFO 대기열로 바뀌었다.
 
LinkedBlockingDeque
그것은 양방향 양단 체인표를 바탕으로 헤드 노드와 꼬리 노드의 인용을 가지고 있다.노드(Node)는 대기열 요소를 저장하는 최소 단위이며 이전 노드와 다음 노드의 참조를 포함하는 정적 내부 클래스입니다.
    static final class Node<E> {
        E item;
        Node<E> prev;
        Node<E> next;
        Node(E x) {
            item = x;
        }
    }

이 대기열은 고정된 용량을 가지고 있으며, 구성할 때 용량을 지정하면 더 많은 요소를 삽입할 수 없습니다. 용량 필드인capacity는final 수식자를 가지고 있으며, 용량의 상한선을 예측할 수 없으면 기본 구조 방법을 사용하여 Integer를 사용할 수 있습니다.MAX_용량 값으로 VALUE:
 
    /** Maximum number of items in the deque */
    private final int capacity;
    public LinkedBlockingDeque() {
        this(Integer.MAX_VALUE);
    }
    public LinkedBlockingDeque(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException();
        this.capacity = capacity;
    }

큐는 하나의 ReentrantLock 객체와 두 개의 Condition 객체를 통해 동기화 및 차단을 수행합니다(Condition 사용.
 
    /** Main lock guarding all access */
    final ReentrantLock lock = new ReentrantLock();

    /** Condition for waiting takes */
    private final Condition notEmpty = lock.newCondition();

    /** Condition for waiting puts */
    private final Condition notFull = lock.newCondition();

 
config가 설정되어 있으면.getMaxConnectionsPerPartition() == config.getMinConnectionsPerPartition () 은 LinkedTransferQueue 를 사용하고, 그렇지 않으면 BoundedLinkedTransferQueue를 사용합니다.
Bounded Linked Transfer Queue는 Linked Transfer Queue를 계승하여 용량 제한을 통해 이 종류의'유계(bounded)'버전을 실현하였다.그것은 원자 변수java를 사용했다.util.concurrent.atomic.AtomicInteger는 체인 테이블의 크기를 저장합니다.그리고 Offer 메서드에서 ReentrantLock의 lock 메서드를 호출합니다.
 
	/** No of elements in queue. */
	private AtomicInteger size = new AtomicInteger();
	/** bound of queue. */
	private final int maxQueueSize;
	/** Main lock guarding all access */
	private final ReentrantLock lock = new ReentrantLock();
	public BoundedLinkedTransferQueue(int maxQueueSize){
		this.maxQueueSize = maxQueueSize;
	}

 
 

좋은 웹페이지 즐겨찾기