AQS 의 enq () 방법 CAS 조작 에 대한 의혹

1557 단어 JavaAQS
private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
            //            
            if (t == null) { // Must initialize
                if (compareAndSetHead(new Node()))
                    // tail     
                    tail = head;
            } else {
            	//1.               
                node.prev = t;
                //2.  CAS tail     node
                if (compareAndSetTail(t, node)) {
                    //3.                
                    t.next = node;
                    //for     
                    return t;
                }
            }
        }
    }

이것 은 노드 가 동기 화 대기 열 에 들 어 가 는 방법 입 니 다. 그 중에서 CAS 작업 compare AndSetTail (t, node) 은 tail 의 인용 을 node 로 가리 키 는 역할 을 합 니 다. 매개 변수 t 의 내용 은 tail 의 오래된 인용 대상 주소 이 고 node 는 새로운 노드 의 주소 입 니 다.AQS 에서 compare AndSetTail (t, node) 의 구체 적 인 내용 을 살 펴 보 자.
private final boolean compareAndSetTail(Node expect, Node update) {
        return unsafe.compareAndSwapObject(this, tailOffset, expect, update);
    }
tailOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("tail"));

이 곳 의 tail Offset 은 unsafe 클래스 의 방법 을 통 해 "tail" 변 수 를 자바 대상 의 "시작 주소" 에 비해 오프셋 을 얻 었 습 니 다. 즉, tail Offset 는 tail 의 주소 로 이해 할 수 있 습 니 다.즉, 여기 서 CAS 작업 이 업 데 이 트 된 지식 tail 변수의 주소 에 있 는 데 이 터 는 국부 변수 t 의 값 을 수정 하지 않 고 compare AndSetTail (t, node) 을 실행 한 후에 t 는 원래 의 낡은 체인 끝 을 가리 키 고 tail 은 새로운 노드 를 가리킨다.

좋은 웹페이지 즐겨찾기