Java 멀티스레딩 인터뷰 질문

(*-*)浩
풀어 주다: 2019-12-11 15:05:35
원래의
2903명이 탐색했습니다.

Java 멀티스레딩 인터뷰 질문

스레드란 무엇인가요?

Thread는 운영체제가 작업 스케줄링을 수행할 수 있는 가장 작은 단위이며, 프로세스에 포함되어 실제 동작하는 단위입니다. 프로그래머는 다중 프로세서 프로그래밍에 이를 사용할 수 있으며, 다중 스레딩을 사용하여 계산 집약적인 작업 속도를 높일 수 있습니다. (추천 공부: java 면접 질문)

예를 들어 하나의 스레드가 작업을 완료하는 데 100밀리초가 걸린다면 10개의 스레드를 사용하는 데는 10밀리초밖에 걸리지 않습니다. 작업을 완료하려면.

스레드와 프로세스의 차이점은 무엇인가요?

스레드는 프로세스의 하위 집합입니다. 프로세스에는 여러 스레드가 있을 수 있으며 각 스레드는 서로 다른 작업을 병렬로 수행합니다. 서로 다른 프로세스는 서로 다른 메모리 공간을 사용하며 모든 스레드는 동일한 메모리 공간을 공유합니다. 각 스레드에는 로컬 데이터를 저장하기 위한 별도의 스택 메모리가 있습니다.

Java에서 스레드를 구현하는 방법은 무엇인가요?

두 가지 방법: java.lang.Thread 클래스의 인스턴스는 스레드이지만 스레드 클래스 자체가 스레드이므로 실행하려면 java.lang.Runnable 인터페이스를 호출해야 합니다. Runnable 인터페이스를 호출하므로 java.lang.Thread 클래스를 상속하거나 Runnable 인터페이스를 직접 호출하여 run() 메서드를 재정의하여 스레드를 구현할 수 있습니다.

Java 키워드 휘발성과 동기화의 기능과 차이점은 무엇인가요?

1, 휘발성

수정하는 변수는 복사본을 유지하지 않고 메인 메모리에 직접 액세스합니다.

Java 메모리 모델에는 주 메모리가 있고 각 스레드에도 자체 메모리(레지스터 등)가 있습니다. 성능을 위해 스레드는 액세스하는 변수의 복사본을 자체 메모리에 보관합니다.

이렇게 하면 한 스레드의 메모리에 있는 동일한 변수의 값이 다른 스레드의 메모리에 있는 값이나 특정 순간의 메인 메모리에 있는 값과 일치하지 않을 수 있습니다.

변수를 휘발성으로 선언한다는 것은 해당 변수가 언제든지 다른 스레드에 의해 수정되므로 스레드 메모리에 캐시할 수 없다는 의미입니다.

2,synchronous

메서드나 코드 블록을 수정하는 데 사용되는 경우 최대 하나의 스레드가 동시에 코드를 실행하도록 보장할 수 있습니다.

1. 두 개의 동시 스레드가 동일한 개체 개체의 동기화된(this) 동기화 코드 블록에 액세스하는 경우 한 번에 하나의 스레드만 실행할 수 있습니다. 다른 스레드는 이 코드 블록을 실행하기 전에 현재 스레드가 이 코드 블록 실행을 완료할 때까지 기다려야 합니다.

2. 그러나 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 다른 스레드는 여전히 객체의 동기화되지 않은(this) 동기화 코드 블록에 액세스할 수 있습니다.

3 가장 중요한 점은 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스할 때 다른 스레드가 객체의 다른 모든 동기화된(this) 동기화 코드 블록에 액세스하는 것이 차단된다는 것입니다. .

4. 스레드가 객체의 동기화된(this) 동기화 코드 블록에 액세스하면 이 객체의 객체 잠금을 얻습니다. 결과적으로 개체 개체의 모든 동기화된 코드 부분에 대한 다른 스레드의 액세스가 일시적으로 차단됩니다.

5. 위의 규칙은 다른 객체 잠금에도 적용됩니다.

다른 스레드 수명 주기는 무엇인가요?

Java 프로그램에서 새 스레드를 생성하면 해당 스레드의 상태는 New입니다. 스레드의 start() 메서드를 호출하면 상태가 Runnable로 변경됩니다. 스레드 스케줄러는 Runnable 스레드 풀의 스레드에 CPU 시간을 할당하고 상태를 실행 중으로 변경합니다. 다른 스레드 상태에는 대기 중, 차단됨, 작동 불능 등이 있습니다.

스레드 우선순위에 대해 어떻게 이해하고 있나요?

모든 스레드에는 우선 순위가 있습니다. 일반적으로 우선 순위가 높은 스레드는 실행 시 우선 순위를 갖지만 이는 스레드 예약에 따라 다르며 이 구현은 OS에 따라 다릅니다.

스레드의 우선순위를 정의할 수 있지만 이것이 우선순위가 높은 스레드가 우선순위가 낮은 스레드보다 먼저 실행된다는 보장은 없습니다. 스레드 우선순위는 int 변수(1-10)입니다. 1은 가장 낮은 우선순위를 나타내고 10은 가장 높은 우선순위를 나타냅니다.

교착상태란 무엇인가요? 교착상태를 분석하고 방지하는 방법은 무엇입니까?

Deadlock은 2개 이상의 스레드가 영원히 차단되는 상황을 의미합니다. 이 상황에는 최소 2개 이상의 스레드와 2개 이상의 리소스가 필요합니다.

교착 상태를 분석하려면 Java 애플리케이션의 스레드 덤프를 살펴봐야 합니다. BLOCKED 상태에 있는 스레드와 그들이 기다리고 있는 리소스를 찾아야 합니다. 각 리소스에는 고유한 ID가 있으며, 이 ID를 사용하면 이미 개체 잠금을 소유한 스레드를 찾을 수 있습니다.

중첩된 잠금을 피하고, 필요한 경우에만 잠금을 사용하고, 무기한 대기를 피하는 것이 교착 상태를 피하는 일반적인 방법입니다.

스레드 안전성이란 무엇인가요? Vector는 스레드로부터 안전한 클래스인가요?

코드가 있는 프로세스에서 동시에 실행 중인 여러 스레드가 있는 경우 이러한 스레드가 이 코드를 동시에 실행할 수 있습니다. 각 실행의 결과가 단일 스레드 실행의 결과와 동일하고 다른 변수의 값도 예상과 동일하면 스레드로부터 안전합니다.

스레드 안전 카운터 클래스는 여러 스레드에서 동일한 인스턴스 개체를 사용할 때 계산 오류를 일으키지 않습니다. 분명히 컬렉션 클래스를 스레드로부터 안전하고 스레드로부터 안전하지 않은 두 그룹으로 나눌 수 있습니다. Vector는 동기화된 메서드를 사용하여 스레드 안전성을 달성하는 반면, 이와 유사한 ArrayList는 스레드로부터 안전하지 않습니다.

Java에서 스레드를 중지하는 방법은 무엇입니까?

Java는 풍부한 API를 제공하지만 스레드 중지를 위한 API는 제공하지 않습니다. JDK 1.0에는 원래 stop(), suspens() 및 이력서()와 같은 일부 제어 메서드가 있었지만 잠재적인 교착 상태 위협으로 인해 후속 JDK 버전에서는 더 이상 사용되지 않습니다. 스레드를 중지하는 안전한 방법.

run() 또는 call() 메서드가 실행되면 스레드가 자동으로 종료됩니다. 스레드를 수동으로 종료하려면 휘발성 부울 변수를 사용하여 run() 메서드 루프를 종료하거나 작업을 취소하여 중단할 수 있습니다. the thread

ThreadLocal이란 무엇입니까?

ThreadLocal은 스레드의 로컬 변수를 생성하는 데 사용됩니다. 우리는 객체의 모든 스레드가 전역 변수를 공유한다는 것을 알고 있으므로 이러한 변수는 스레드로부터 안전하지 않습니다. . 그러나 동기화를 사용하지 않으려면 ThreadLocal 변수를 선택할 수 있습니다.

각 스레드에는 자체 Thread 변수가 있으며 get()set() 메서드를 사용하여 기본값을 가져오거나 스레드 내에서 값을 변경할 수 있습니다. ThreadLocal 인스턴스는 일반적으로 연결된 스레드 상태가 비공개 정적 속성이기를 원합니다.

Sleep(), suspens() 및 wait()의 차이점은 무엇인가요?

Thread.sleep()은 지정된 시간에 현재 스레드를 "실행 불가능" 상태로 설정합니다. 스레드는 항상 개체의 모니터를 보유합니다. 예를 들어, 스레드가 현재 동기화된 블록이나 메서드에 있는 경우 다른 스레드는 해당 블록이나 메서드에 들어갈 수 없습니다. 다른 스레드가 Interrupt() 메서드를 호출하면 "휴면" 스레드가 깨어납니다.

참고: sleep()은 정적 메서드입니다. 이는 현재 스레드에 대해서만 유효하다는 것을 의미합니다. 일반적인 실수는 t.sleep()을 호출하는 것입니다(여기서 t는 현재 스레드와 다른 스레드입니다).

t.sleep()이 실행되더라도 t 스레드가 아닌 현재 스레드가 절전 모드로 전환됩니다. t.sun()은 오래된 방법입니다. suspend()를 사용하면 스레드가 정체 상태에 들어갈 수 있습니다. Suspend()는 쉽게 교착 상태 문제를 일으킬 수 있습니다.

object.wait()는 현재 스레드를 "실행 불가능" 상태로 설정합니다. sleep()과의 차이점은 대기가 스레드가 아닌 개체의 메서드라는 것입니다. object.wait()를 호출할 때 스레드는 먼저 이 개체의 개체 잠금을 획득해야 합니다. 현재 스레드는 잠금 개체에 대한 동기화를 유지하고 현재 스레드를 대기 대기열에 추가해야 합니다.

그런 다음 다른 스레드가 동일한 개체 잠금을 동기화하여 object.notify()를 호출할 수 있으며, 이는 원래 대기 스레드를 깨운 다음 ​​잠금을 해제합니다. 기본적으로 wait()/notify()는 sleep()/interrupt()와 비슷하지만 전자가 객체 잠금을 획득해야 한다는 점만 다릅니다.

스레드 기아란 무엇이며 라이브락은 무엇입니까?

모든 스레드가 차단되거나 필요한 리소스가 잘못되어 처리할 수 없는 경우 리소스를 사용할 수 있게 해주는 비차단 스레드가 없습니다. Java API의 스레드 라이브록은 다음과 같은 상황에서 발생할 수 있습니다.

1. 모든 스레드가 프로그램에서 Object.wait(0)을 실행할 때 매개변수가 0인 wait 메서드가 사용됩니다. 프로그램은 스레드가 해당 객체에 대해 Object.notify() 또는 Object.notifyAll()을 호출할 때까지 실시간 잠금을 수행합니다.

2, 모든 스레드가 무한 루프에 걸린 경우.

Java Timer 클래스란 무엇인가요? 특정 시간 간격으로 작업을 생성하는 방법은 무엇입니까?

java.util.Timer는 미래의 특정 시간에 실행할 스레드를 예약하는 데 사용할 수 있는 도구 클래스입니다. Timer 클래스는 일회성 작업이나 주기적인 작업을 예약하는 데 사용할 수 있습니다.

java.util.TimerTask는 Runnable 인터페이스를 구현하는 추상 클래스입니다. 자체 예약 작업을 생성하고 Timer를 사용하여 실행을 예약하려면 이 클래스를 상속해야 합니다.

Java에서 동기화된 컬렉션과 동시 컬렉션의 차이점은 무엇인가요?

동기화 컬렉션과 동시 컬렉션 모두 멀티스레딩과 동시성에 적합한 스레드로부터 안전한 컬렉션을 제공하지만 동시 컬렉션은 확장성이 더 뛰어납니다.

Java 1.5 이전에는 프로그래머가 동기화된 컬렉션만 사용할 수 있었기 때문에 다중 스레드 동시성 중에 경합이 발생하여 시스템 확장성이 저해되었습니다.

Java5에서는 스레드 안전성을 제공할 뿐만 아니라 잠금 분리 및 내부 파티셔닝과 같은 최신 기술을 통해 확장성을 향상시키는 ConcurrentHashMap과 같은 동시 컬렉션을 도입했습니다.

동기화 방법과 동기화 블록 중 어느 것이 더 나은 선택인가요?

동기화 블록은 전체 개체를 잠그지 않기 때문에 더 나은 선택입니다(물론 전체 개체를 잠그도록 만들 수도 있습니다). 동기화된 메서드는 클래스에 관련되지 않은 동기화된 블록이 여러 개 있는 경우에도 전체 개체를 잠급니다. 이로 인해 일반적으로 해당 블록의 실행이 중지되고 개체에 대한 잠금을 얻을 때까지 기다려야 합니다.

스레드 풀이란 무엇인가요? 왜 그것을 사용합니까?

스레드를 생성하려면 리소스와 시간이 많이 소요됩니다. 작업이 올 때만 스레드를 생성하면 응답 시간이 길어지고 프로세스에서 생성할 수 있는 스레드 수가 제한됩니다.

이러한 문제를 방지하기 위해 프로그램이 시작될 때 처리에 응답하기 위해 여러 스레드가 생성되며, 이를 스레드 풀이라고 하며, 내부 스레드를 작업자 스레드라고 합니다.

JDK1.5부터 Java API는 다양한 스레드 풀을 생성할 수 있도록 Executor 프레임워크를 제공합니다. 예를 들어, 단일 스레드 풀은 고정된 수의 스레드 풀 또는 캐시 스레드 풀(단기 작업이 많은 프로그램에 적합한 확장 가능한 스레드 풀)을 한 번에 하나의 작업을 처리합니다.

Java에서 InvokeAndWait와 InvokeLater의 차이점은 무엇입니까?

이 두 가지 방법은 이벤트 전달 스레드 대신 현재 스레드에서 GUI 구성 요소를 업데이트하기 위해 Java 개발자에게 Swing API에서 제공됩니다. InvokeAndWait()는 진행률 표시줄과 같은 GUI 구성 요소를 동기적으로 업데이트하고 나면 진행률 표시줄도 이에 따라 변경되어야 합니다.

여러 스레드에서 진행 상황을 추적하는 경우, InvokeAndWait() 메서드를 호출하여 그에 따라 구성 요소를 업데이트하도록 이벤트 전달 스레드를 요청합니다. InvokeLater() 메서드는 업데이트 구성 요소를 비동기적으로 호출합니다.

멀티스레딩에서 비지 루프란 무엇인가요?

비지 루프는 프로그래머가 루프를 사용하여 루프를 만드는 것입니다. 스레드 대기. wait(), sleep() 또는 Yield()와 같은 전통적인 방법은 모두 CPU 제어를 포기하지만 바쁜 루프는 CPU를 포기하지 않고 단지 빈 루프를 실행합니다. 이것의 목적은 CPU 캐시를 보존하는 것입니다.

멀티 코어 시스템에서는 대기 중인 스레드가 깨어날 때 다른 코어에서 실행 중일 수 있으며 이로 인해 캐시가 다시 빌드됩니다. 캐시 재구축을 방지하고 재구축 대기 시간을 줄이기 위해 사용할 수 있습니다.

위 내용은 Java 멀티스레딩 인터뷰 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿