Java8 ReentrantLock 조건 운용

Java8 ReentrantLock 조건 운용
  • 링크 드 BlockingQueue 에서 의 사용 장면

  • 가지 고 있 는 자물쇠
  • 요소 삽입
  • 3.원소 획득
  • 경험 총화

    링크 드 BlockingQueue 에서 의 사용 장면
       LinkedBlockingQueue  ,  ReentrantLock Condition   。
    

    1.소지 한 자물쇠
    /** Lock held by take, poll, etc */
    private final ReentrantLock takeLock = new ReentrantLock(); //     
    
    /** Wait queue for waiting takes */
    private final Condition notEmpty = takeLock.newCondition(); //      
    
    /** Lock held by put, offer, etc */
    private final ReentrantLock putLock = new ReentrantLock(); //     
    
    /** Wait queue for waiting puts */
    private final Condition notFull = putLock.newCondition(); //      
    

    2.요소 삽입
    public boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException {
    
        if (e == null) throw new NullPointerException(); //      ,       
        long nanos = unit.toNanos(timeout); //          
        final int c;
        final ReentrantLock putLock = this.putLock; //     
        final AtomicInteger count = this.count; //    
        putLock.lockInterruptibly(); //       
        try {
            while (count.get() == capacity) { //     ,    
                if (nanos <= 0L) //       
                    return false; //  false,      
                nanos = notFull.awaitNanos(nanos); //    CPU  ,    ,    ,  while  
            }
            enqueue(new Node(e)); //     ,    ,       
            c = count.getAndIncrement(); //         ,       +1
            if (c + 1 < capacity) //     
                notFull.signal();  //  notFull
        } finally {
            putLock.unlock(); //       
        }
        if (c == 0) //          0
            signalNotEmpty(); //     ,  notEmpty
        return true; //  true,      
    }
    

    3.원소 가 져 오기
    public E poll(long timeout, TimeUnit unit) throws InterruptedException {
        final E x;
        final int c;
        long nanos = unit.toNanos(timeout); //          
        final AtomicInteger count = this.count; //    
        final ReentrantLock takeLock = this.takeLock; //     
        takeLock.lockInterruptibly(); //       
        try {
            while (count.get() == 0) { //     ,    
                if (nanos <= 0L) //       
                    return null; //  null,      
                nanos = notEmpty.awaitNanos(nanos); //    CPU  ,    ,    ,  while  
            }
            x = dequeue(); //     ,    ,             
            c = count.getAndDecrement(); //         ,       -1
            if (c > 1) //     
                notEmpty.signal(); //  notEmpty
        } finally {
            takeLock.unlock(); //       
        }
        if (c == capacity) //          
            signalNotFull(); //     ,  notFull
        return x; //       
    }
    

    4.경험 총화
    1. Condition:    ,  while    。1.            ;2.    。
    2. LinkedBlockingQueue      takeLock、putLock,     ,            ,        ,  putLock       signalNotEmpty,  takeLock 。
    

    좋은 웹페이지 즐겨찾기