Java 기초 학습 의 -- Object 클래스 이해
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 를 호출 한 것 을 발견 할 수 있 습 니 다.요약 하면 Object 류 는 자바 의 초석 이다.여기 서 어 려 운 것 은 wait / notify 입 니 다. 자바 의 API 를 배 우 는 것 입 니 다. 조금 만 이해 하려 면 JVM 의 c + 소스 코드 를 돌 릴 수 없 을 것 같 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.