Java 소스 해상도ConcurrentHashMap의 초기화

1810 단어 Java 소스 확인
일단 코드를 볼게요.
private final Node[] initTable() {
        Node[] tab; int sc;
        while ((tab = table) == null || tab.length == 0) { //      
            if ((sc = sizeCtl) < 0)
                Thread.yield(); // lost initialization race; just spin
            else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) {
                try {
                    if ((tab = table) == null || tab.length == 0) {//      
                        int n = (sc > 0) ? sc : DEFAULT_CAPACITY;
                        @SuppressWarnings("unchecked")
                        Node[] nt = (Node[])new Node,?>[n];
                        table = tab = nt;
                        sc = n - (n >>> 2);
                    }
                } finally {
                    sizeCtl = sc;
                }
                break;
            }
        }
        return tab;
    }

ConcurrentHashMap을 초기화할 때 다중 스레드 간의 동기화는 어떻게 진행합니까?
ConcurrentHashMap을 초기화할 때 먼저 해시표가 초기화되었는지 판단합니다.없으면 초기화를 시도합니다.
먼저 sizectl 값이 판단됩니다.sizectl은 다중 스레드 간 동기화에 사용되는 상호 배율 변수입니다.sizectl < 0일 때, 이미 라인이 해시 테이블을 초기화하고 있거나 해시 테이블이 확장되고 있음을 나타냅니다. 이 때 더 이상 조작할 수 없습니다.
여기에서 sizectl은 사실 자전거 자물쇠의 기능을 실현하였다.자물쇠를 가져오는 데 실패했을 때 CPU를 양보하고 나중에 다시 시도해 보십시오. 자물쇠를 가져올 때까지 이 과정을 반복합니다.CPU를 내보내는 동작은 자바의 Thread를 통해서입니다.이eld ()로 이루어졌습니다.학교에서 자바를 공부할 때 이 방법을 접한 적이 있지만 어떤 장면에서 사용될지 몰랐어요.원래, Thread.ield () 방법은 자전거 자물쇠를 실현하는 데 사용할 수 있다.
여기서 질문 하나 드릴게요. 자물쇠 선택 방식과 사순환 방식으로sizectl의 값을 판단할 수 있는데 어떤 차이가 있습니까?
물론 효율이 다르다.사순환할 때, 프로그램은sizectl의 값을 빈번하게 읽으며, 조건을 만족시키기 전에 많은 CPU 주기를 낭비할 것이다.셀프 잠금의 효율은 더욱 높다. 왜냐하면 셀프 잠금이 조건에 부합되지 않는다고 판단할 때 CPU를 자발적으로 양보하기 때문이다. 이때 현재 스레드는ready 상태에 있고 다음 프로세서가 선택되어 실행할 기회를 기다리기 때문이다.이 기간 동안 다른 스레드는 CPU 주기를 이용할 수 있다.그래서 자전거 자물쇠의 효율이 더 높다.

좋은 웹페이지 즐겨찾기