많은 핵심 Java 인터뷰 질문은 멀티 스레딩 및 컬렉션 프레임 워크에서 나옵니다. 핵심 스레드의 개념을 이해할 때는 실용적인 경험이 필요합니다. 이 기사는 Java 스레딩에 대한 몇 가지 전형적인 질문을 수집하며, 이는 종종 선임 엔지니어가 요청합니다.
0. Java의 다중 스레드 동기화 란 무엇입니까?
다중 스레드 프로그램에서 동기화는 공유 리소스에 대한 액세스를 제어 할 수 있습니다. 동기화가 없으면 Java 스레드가 공유 변수를 수정하는 경우 다른 스레드가 동일한 변수를 사용하거나 업데이트하여 프로그램에서 쉽게 잘못된 결과를 가져올 수 있습니다.
1. 멀티 스레딩을 구현하는 몇 가지 방법을 설명합니까?
Java 스레드는 실행 가능한 인터페이스를 구현하거나 스레드 클래스를 상속하여 구현할 수 있습니다. 여러 번 물려받을 계획이라면 런 가능성을 구현하는 것이 좋습니다.
2. Thread.Start ()와 Thread.Run ()의 차이점은 무엇입니까?
Thread.start () 메소드 (기본)는 스레드를 시작하고 준비 상태로 들어갑니다. CPU가 스레드에 시간을 할당하면 JVM은 run () 메소드를 실행할 예정입니다.
3. 왜 run () 및 start () 메소드가 필요한 이유는 무엇입니까? run () 메소드를 사용하여 작업을 완료 할 수 있습니까?
JVM이 일반 방법의 호출과 다른 별도의 스레드를 생성하기 때문에 run () & start ()의 두 가지 메소드가 필요 하므로이 작업은 스레드의 시작 방법에 의해 수행됩니다. 시작은 로컬 메소드에 의해 구현되며 표시 가능하게 호출해야합니다. 이 두 가지 방법을 사용하는 또 다른 장점은 모든 객체를 스레드로 실행할 수 있다는 것입니다. 실행 가능한 인터페이스가 구현되는 한, 이는 스레드 클래스를 상속하여 발생하는 Java의 여러 상속 문제를 피합니다.
4. ThreadLocal 클래스는 무엇이며 사용 방법은 무엇입니까?
ThreadLocal은 "로컬 스레드"가 아닌 스레드 레벨 로컬 변수입니다. ThreadLocal은 변수를 사용하는 각 스레드에 대한 변수의 독립적 인 사본을 제공합니다. 각 스레드는 사본을 수정할 때 다른 스레드 객체의 사본에 영향을 미치지 않습니다 (번역기 참고).
스레드 로컬 변수의 핵심 사항은 다음과 같습니다.
스레드 로컬 변수 (ThreadLocal 변수)는 편리하게 각 스레드에 대해 별도의 변수를 제공합니다.
ThreadLocal 인스턴스는 일반적으로 클래스에 정적 개인 (개인 정적) 필드로 표시되며 스레드를 연결하는 데 사용됩니다.
다중 스레드가 ThreadLocal 인스턴스에 액세스하면 각 스레드는 ThreadLocal에서 제공하는 변수의 독립적 인 사본을 유지합니다.
일반적으로 사용되는 용도는 DAO 모드에서 볼 수 있습니다. DAO 클래스가 싱글 톤 클래스 인 경우, 데이터베이스 연결은 각 스레드에 의해 독립적으로 유지되며 서로 영향을 미치지 않습니다. (스레드 기반 싱글 톤)
5. InvalidMonitorStateException은 언제 던져 질 것인가?
Wait ()/notify ()/notifyall ()에서 메소드를 호출 할 때, 현재 스레드가 객체의 잠금을 얻지 못하면, 불법 모니터 스테이트 exception을 제외하고 (즉, 프로그램이 객체의 동기화 블록 또는 동기화 메소드를 실행하지 않는 경우에도 대기 ()/notifyall ()을 호출하려고 시도합니다. 예외는 runtimeexcpetion의 서브 클래스이므로 예외는 잡을 필요가 없습니다 (원하는만큼 잡을 수는 있지만). runtimeexception으로서, 그러한 예외는 wait (), notify (), notifyall () 메소드 서명에 언급되지 않습니다.
6. sleep (), Sportend () 및 Wait ()의 차이점은 무엇입니까?
Thread.Sleep ()는 지정된 시간에 "실행할 수없는"상태로 현재 스레드를 만듭니다. 스레드는 항상 객체의 모니터를 보유합니다. 예를 들어, 스레드가 현재 동기화 블록 또는 동기화 메소드에있는 경우 다른 스레드는 블록 또는 메소드에 들어갈 수 없습니다. 다른 스레드가 인터럽트 () 메소드를 호출하면 해당 "잠자는"스레드가 깨어납니다.
참고 : Sleep ()는 정적 방법입니다. 이것은 현재 스레드에만 유효하며 일반적인 오류는 t.sleep ()를 호출하는 것입니다 (여기서는 현재 스레드와 다른 스레드입니다). t.sleep ()가 실행 되더라도 현재 스레드는 T 스레드가 아닌 잠을 자게됩니다. T.suspend ()는 구식 방법입니다. sultend ()를 사용하면 스레드가 정체 상태로 들어갑니다. 스레드는 항상 객체의 모니터를 고정하고 siltend ()는 교착 상태 문제를 일으킬 수 있습니다.
Object.wait ()는 현재 스레드를 "업적 할 수없는"상태에서 나옵니다. sleep ()와 달리 대기는 스레드가 아닌 객체 메소드입니다. 객체를 호출 할 때 ()은 먼저이 객체의 객체 잠금을 얻어야합니다. 현재 스레드는 잠금 객체를 동기화하고 대기 큐에 현재 스레드를 추가해야합니다. 그런 다음 다른 스레드가 동일한 객체 잠금을 동기화하여 Object.notify ()를 호출하여 원래 대기중인 스레드를 깨우고 잠금을 해제 할 수 있습니다. 기본적으로 대기 ()/notify ()는 수면 ()/인터럽트 ()와 유사합니다.
7. 정적 메소드에서 동기화를 사용할 때 어떻게됩니까?
정적 메소드를 동기화 할 때 클래스의 "클래스"객체가 얻어집니다. 따라서 스레드가 동기화 된 정적 메소드에 들어가면 스레드 모니터는 클래스 자체의 객체 잠금을 획득하고 다른 스레드는이 클래스의 정적 동기화 메소드를 입력 할 수 없습니다. 여러 스레드가 다른 인스턴스에 동시에 동기식 인스턴스 메소드에 액세스 할 수 있기 때문에 인스턴스 방법과는 다릅니다.
8. 동기화 메소드가 실행되면 스레드가 객체의 비동기 인스턴스 메소드를 호출 할 수 있습니까?
예, 비동기 방법은 항상 아무런 문제없이 호출 할 수 있습니다. 실제로 Java는 비동기 메소드에 대한 검사를 수행하지 않으며 잠금 객체는 동기화 방법 또는 동기 코드 블록으로 만 확인됩니다. 메소드가 동기로 선언되지 않은 경우 공유 데이터를 사용하더라도 Java는 안전한 지 확인하지 않고도 여전히 호출 하므로이 경우 특히주의하십시오. 메소드가 선언되는지 여부는 동기식이 중요 섹션 액세스에 따라 다릅니다. 메소드가 임계 섹션 (공유 리소스 또는 데이터 구조)에 액세스하지 않으면 동기를 선언 할 필요는 없습니다.
예는 다음과 같습니다. 공통 클래스에는 두 가지 방법 SynchronizedMethod1 ()와 Method1 ()이 있으며 Mythread 클래스는이 두 가지 메소드를 독립 스레드로 호출합니다.
public class common {public synchronized void synchronizedmethod1 () {system.out.println ( "SynchronizedMethod1 kel"); try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "SynchronizedMethod1 완료"); } public void method1 () {system.out.println ( "메소드 1 호출"); try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "메소드 1 완료"); }} 공개 클래스 Mythread는 스레드 {private int id = 0; 개인 공통 공통; public mythread (문자열 이름, int no, common object) {super (name); 공통 = 객체; id = 아니요; } public void run () {system.out.println ( "실행 스레드" + this.getName ()); try {if (id == 0) {common.synchronizedmethod1 (); } else {common.method1 (); }} catch (예외 e) {e.printstacktrace (); }} public static void main (String [] args) {common c = new Common (); Mythread T1 = New Mythread ( "Mythread-1", 0, C); Mythread T2 = New Mythread ( "Mythread-2", 1, C); t1.start (); t2.start (); }}프로그램의 출력은 다음과 같습니다.
실행 스레드 Mythread-1
SynchronizedMethod1 호출
실행 스레드 Mythread-2
방법 1 호출
동기화 Method1 완료
방법 1 완료
결과는 SynchronizedMethod1 () 메소드가 실행 되더라도 Method1 ()가 호출된다는 것을 보여줍니다.
9. 두 스레드가 객체에서 두 개의 다른 동기 인스턴스 메소드를 호출 할 수 있습니까?
아니요, 객체가 인스턴스 메소드를 동기화 했으므로 스레드는 객체의 객체 잠금을 얻습니다. 따라서 다른 동기화 방법은 객체 잠금이 해제 된 후에 메소드가 해제 된 후에 만 실행할 수 있습니다. 다음 코드 예제는 매우 명확합니다. 공통 클래스는 SynchronizedMethod1 () 및 SynchronizedMethod2 () 메소드를 가지며 Mythread는이 두 가지 메소드를 호출합니다.
public class common {public synchronized void synchronizedmethod1 () {system.out.println ( "SynchronizedMethod1 kel"); try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "SynchronizedMethod1 완료"); } public synchronized void synchronizedmethod2 () {system.out.println ( "SynchronizedMethod2 wall"); try {thread.sleep (1000); } catch (InterruptedException e) {e.printstacktrace (); } system.out.println ( "SynchronizedMethod2 완료"); }} 공개 클래스 Mythread는 스레드 {private int id = 0; 개인 공통 공통; public mythread (문자열 이름, int no, common object) {super (name); 공통 = 객체; id = 아니요; } public void run () {system.out.println ( "실행 스레드" + this.getName ()); try {if (id == 0) {common.synchronizedmethod1 (); } else {common.synchronizedMethod2 (); }} catch (예외 e) {e.printstacktrace (); }} public static void main (String [] args) {common c = new Common (); Mythread T1 = New Mythread ( "Mythread-1", 0, C); Mythread T2 = New Mythread ( "Mythread-2", 1, C); t1.start (); t2.start (); }}10. 교착 상태는 무엇입니까?
교착 상태는 두 개 이상의 스레드가 무한히 막히고 스레드가 필요한 리소스를 서로 대기하고 있음을 의미합니다. 이는 두 스레드가 다른 리소스에 대한 잠금 장치를 획득하려고 시도 할 때 발생할 수 있으며, 각 스레드는 사용자 프로세스가 종료되지 않는 한 다른 리소스 잠금 장치의 릴리스를 무기한으로 기다리고 있습니다. Javaapi에 관한 한, 다음 상황에서 실 교착 상태가 발생할 수 있습니다.
11. 굶주린 실이 무엇이며 살아있는 자물쇠는 무엇입니까?
스레드 기아와 생명 잠금은 교착 상태와 같은 일반적인 문제로 간주되지 않지만 동시 프로그래밍 디자이너를 만나는 것과 같습니다.
필요한 자원이 유효하지 않아 모든 스레드가 차단되거나 처리 할 수없는 경우 리소스를 사용할 수 있도록 블로킹 스레드가 없습니다. Javaapi의 스레드 라이브 잠금 장치는 다음 상황에서 발생할 수 있습니다.
여기의 질문은 자세한 내용이 아닙니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!