면접 문제
8837 단어 jdk
class Sample {
private int number;
public synchronized void increase() {
while (0 != number) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number++;
System.out.println(number);
this.notifyAll();
}
public synchronized void decrease() {
while (0 == number) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
number--;
System.out.println(number);
this.notifyAll();
}
}
class IncreaseThread implements Runnable {
private Sample sample;
public IncreaseThread(Sample sample) {
this.sample = sample;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
Thread.sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
sample.increase();
}
}
}
class DecreaseThread implements Runnable {
private Sample sample;
public DecreaseThread(Sample sample) {
this.sample = sample;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
try {
Thread.sleep((long)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
sample.decrease();
}
}
}
public class MainTest {
public static void main(String[] args) {
Sample sample = new Sample();
Runnable runnable1 = new IncreaseThread(sample);
Runnable runnable2 = new DecreaseThread(sample);
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
thread1.start();
thread2.start();
}
}
wait(), notify(), notifyAll() 및 sleep() 방법에 대한 관계
1) 만약에 한 라인이 어떤 대상의wait방법을 호출한다면 이 라인은 먼저 대상의 자물쇠(synchronized)를 가져야 한다. 다시 말하면 이wait방법은synchronized에 나타나야 한다.
2) 만약에 한 라인이 어떤 대상의wait 방법을 호출한다면 이 라인은 해당 대상의 자물쇠를 방출한다.
3) 자바 대상에는 두 가지 연못(잠금연못과 대기연못)이 있다.
4) 한 라인이 대상의wait 방법을 호출하면 라인이 대상의 대기 탱크에 들어갑니다(자물쇠 풀기). 만약에 미래 어느 순간에 다른 라인이 같은 대상의 notify/notifyAll 방법을 호출한다면 이 대기 탱크에서 기다리는 라인은 일어나서 대상의 자물쇠에 들어가 대상의 자물쇠를 얻기를 기다립니다. 자물쇠가 성공하면그러면 이 라인은wait 방법 이후의 경로를 따라 계속 실행될 것이다.
5)Thread.sleep(long), 만약에 한 라인이 sleep 방법으로 수면을 취하면 수면과 동시에 대상의 자물쇠의 소유권을 잃지 않는다.
6) wait, notify, notify All 방법은 모두 Object 클래스에 정의되어 있고 final이기 때문에 모든 자바 클래스에 계승되어 다시 쓸 수 없습니다.이 두 가지 방법은 호출할 때 라인이 대상의 자물쇠를 얻었어야 한다고 요구한다.이 세 가지 방법은 동기화 감시 대상/자물쇠에 의해 호출되어야 한다. 자물쇠는 임의의 대상이 될 수 있고 임의의 대상이 호출되는 방식은 반드시 Object에 정의된다.
7) notify 방법은 대기 탱크에서 대기 중인 라인을 무작위로 깨우는 것이고, notify All 방법은 모든 대기 탱크의 라인을 깨우는 것이다.
8) wait는 재부팅하는 방법이 있는데 public final void wait(long timeout)는 지정된 시간이 지나면 라인이 자동으로 대기탱크에 들어가 호출되기를 기다리는 것을 나타낸다.지정된 시간이 되지 않았을 때 notify/notify All 방법으로 깨울 수 있습니다.
9)wait (): 현재 스레드가 모니터에 들어가는 것을 포기하고 다른 스레드가 같은 모니터를 호출하고 notify () 또는 notify All () 를 호출할 때까지 기다립니다.notify (): 같은 대상 감청기에서wait 방법을 호출하는 첫 번째 라인을 깨우기;notifyAll (): 같은 대상 감청기에서 wait 방법을 호출하는 모든 라인을 깨웁니다.
10)wait는 시간을 지정할 수도 있고 지정하지 않을 수도 있다.sleep는 시간을 지정해야 합니다.동기화 중 CPU에 대한 집행권과 자물쇠 처리가 다르다:wait는 집행권을 방출하고 자물쇠를 방출한다.sleep 집행권을 방출하고 자물쇠를 방출하지 않음;
11)synchronized 수식 방법은 이 종류의 기본 실례(this)는 동기화 모니터이기 때문에 동기화 방법에서 이 세 가지 방법을 직접 호출할 수 있다.synchronized가 수식한 동기화 코드 블록, 동기화 모니터는 괄호 안의 대상이기 때문에 이 대상을 사용하여 이 세 가지 방법을 호출해야 한다.
12) Lock 객체를 사용하여 동기화를 보장할 때 시스템에 암시적인 동기화 감시 대상이 존재하지 않는다면 이 세 가지 방법을 사용할 수 없다. 그러면 어떻게 해야 하는가?이때 Lock은 동기화 방법/동기화 코드 블록을 대체하고 동기화된 스텔스 자물쇠를 디스플레이 자물쇠 동작으로 바꾸어 하나의 자물쇠에 여러 개의 모니터를 추가할 수 있다.Condition은 동기화 모니터 기능을 대체합니다.Condition 객체는 Lock 객체의 new Condition() 방법으로 작성됩니다.그 안의 방법은 다음과 같다. await(): 동기화 감청기와 같은wait() 방법.signal (): 동기화 감청기와 같은 notify () 방법;signalAll(): 동기화 감청기와 같은 notifyAll() 방법.예전에는 한 개의 자물쇠에 한 개의 모니터 방법만 있을 수 있었다.이제 한 Lock 자물쇠에 여러 개의 모니터 메소드 객체를 그룹화할 수 있습니다.한 조는 생산자를 책임지고 한 조는 소비자를 책임질 수 있다.
synchronized 키워드의 역할 1) 특정한 대상의 모든synchronized 방법 중 어느 순간에 유일한 라인만 이synchronized 방법에 접근할 수 있다.
2) 만약에 한 방법이synchronized 방법이라면 이synchronized 키워드는 현재 대상에 잠금(즉this)한다.
3) 만약synchronized 방법이 static이라면 이synchronized 키워드는 현재 대상에 대응하는 Class 대상에 자물쇠를 채우는 것을 나타낸다. (클래스마다 대상을 얼마나 생성하든지 대응하는 Class는 하나뿐이다.)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
2022년 3월 21일 TIL1. JVM & JDK JVM JRE 자바 실행 환경의 약자로 자바 프로그램을 실행하기 위한 도구들이 들어있으며 JVM이 이 안에 포함된다 JDK JRE + 개발툴 javac는 컴파일 명령어 HelloWorld.cl...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.