Java 기초 학습 의 -- Object 클래스 이해

4141 단어 자바waitnotify
자바 API 의 Object 클래스 를 보면 모두 11 가지 방법 이 있 습 니 다.사용 빈도 순위:
  • toString() 이 방법 은 로그, 포 지 셔 닝 코드 문제 에 가장 많이 사용 된다.
  • equals()hashCode() 두 가지 방법의 사용 전형 적 인 예 는 HashMap 의 소스 코드
  • 이다.
        public V put(K key, V value) {
            if (table == EMPTY_TABLE) {
                inflateTable(threshold);
            }
            if (key == null)
                return putForNullKey(value);
            int hash = hash(key);
            int i = indexFor(hash, table.length);
            for (Entry e = table[i]; e != null; e = e.next) {
                Object k;
                if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                    V oldValue = e.value;
                    e.value = value;
                    e.recordAccess(this);
                    return oldValue;
                }
            }
    
            modCount++;
            addEntry(hash, key, value, i);
            return null;
        }
    equals()hashCode() 보다 조금 더 자주 사용한다.
  • wait()notify() 이 개발 은 직접적 으로 사용 되 지 않 지만 간접 적 으로 사용 하 는 장면 이 적지 않 아 내공 적 인 부분 에 속한다.wait/notify Object 류 가 가장 이해 하기 어 려 운 점 에 속 합 니 다. 초석 은 다 중 스 레 드 이기 때 문 입 니 다.학습 방향 은 역시 세 걸음 이다.

  • step 1: 문서 설명 보기
    wait()
    Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.
    
    notify()
    Wakes up a single thread that is waiting on this object's monitor.

    이 문 서 는 기본 적 인 안 개 를 보고 두 가지 방법 모두 다음 과 같은 핵심 개념 thread 을 언급 했다 는 것 을 설명 한다. object's monitor우선 이 개념 들 을 내 버 려 두 고 어떻게 쓰 는 지 보 자.
    step 2: 데모 실행
    demo 에 게 보조 적 인 이 해 를 해 주 십시오. 하 나 는 일 을 하 는 것 이 고 다른 하 나 는 일 을 관리 하 는 것 입 니 다.책임자 가 일 을 끝내 고 검 수 를 기다리다.
    public class WaitNotifyDemo {
    
        static class Worker extends Thread{
    
            private volatile int status=0; // 1:   , -1:   
    
            @Override
            public void run(){
    
                try {
                    System.out.println(Thread.currentThread().getName() +":     ");
                    Thread.sleep(3000);
                    System.out.println(Thread.currentThread().getName() +":     ");
    
                    status = 1;
                    //      
                    synchronized (this){
                        this.notify();
                    }
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    status = -1;
                }
            }
    
            public int getStatus(){
                return status;
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            Worker worker= new Worker();
            worker.start();
    
            synchronized (worker){
                int status;
                while ((status=worker.getStatus())!=1){
                    worker.wait();
                    if(status==-1)
                        throw new RuntimeException("   ");
                }
            }
            System.out.println("      ");
        }
    }
    

    step 3: demo 를 괴 롭 히 고 나 서 notify 코드 를 지 워 도 정상적으로 작 동 할 수 있 습 니 다.이것 은 사람 을 곤 혹 스 럽 게 한다. 문서 가 분명히 말 했다 notify,wait .다음 문서 보기:
    A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup

    따라서 wait 방법 은 while 순환 에서 호출 되 어야 합 니 다.좋아, 약간의 의혹 을 풀 었 다.그러나 Worker 스 레 드 가 끝 날 때마다 notify 를 호출 하지 않 으 면 메 인 스 레 드 가 정상적으로 종 료 됩 니 다. 이것 도 말 이 안 됩 니 다.유일한 해석 은 JVM 내부 에서 어 딘 가 에 notify 를 호출 했다 는 것 이다.openjdk 의 소스 코드 를 보면 역시 이와 같 습 니 다. start 0 부터 스 레 드 가 종료 할 때 호출 됩 니 다 lock.notify_all(thread);.다만 이곳 의 코드 는 JVM 내부 의 코드 로 비교적 밑바닥 이다.
    사실 이 예 에서 더욱 간결 한 문법 은 worker.join() 이다.Thread. join () 의 소스 코드 를 보면, 그 실현 이 마침 wait 를 호출 한 것 을 발견 할 수 있 습 니 다.
  • clone () 이것 은 깊이 있 는 복 제 를 이해 해 야 하고 지식 점 이 복잡 하지 않다.
  • getclass () 이것 은 뒤에 놓 지만 많이 사용 합 니 다. 특히 프레임 워 크 를 씁 니 다.
  • finalize () 이 건 그 가 추천 하지 않 고 GC 의 리듬 을 최대한 방해 하지 않 는 다.

  • 요약 하면 Object 류 는 자바 의 초석 이다.여기 서 어 려 운 것 은 wait / notify 입 니 다. 자바 의 API 를 배 우 는 것 입 니 다. 조금 만 이해 하려 면 JVM 의 c + 소스 코드 를 돌 릴 수 없 을 것 같 습 니 다.

    좋은 웹페이지 즐겨찾기