1. 스레드 동기화와 비동기성이란 무엇입니까?
(추가 면접 질문 추천: java 면접 질문)
동기화(동기화)는 조정된 속도로 미리 정해진 순서에 따라 실행됩니다.
비동기화는 동기화의 반대이며, 차단하지 않고 동시에 실행됩니다.
2. 스레드 안전하지 않음이란 무엇입니까? 어떻게 해결하나요? (핵심)
스레드 안전성이란?
코드가 있는 프로세스에서 동시에 실행 중인 여러 스레드가 있는 경우 이러한 스레드가 이 코드를 동시에 실행할 수 있습니다. 각 실행의 결과가 단일 스레드 실행의 결과와 동일하고 다른 변수의 값도 예상과 동일하면 스레드로부터 안전합니다.
즉, 클래스나 프로그램에서 제공하는 인터페이스는 스레드에 대한 원자적 작업이거나 여러 스레드 간 전환으로 인해 인터페이스의 실행 결과가 모호해지지 않으므로 동기화 문제를 고려할 필요가 없습니다.
스레드 안전 문제는 전역 변수와 정적 변수로 인해 발생합니다.
각 스레드의 전역 변수 및 정적 변수에 대한 쓰기 작업이 없고 읽기 작업만 있는 경우 일반적으로 이 전역 변수는 스레드로부터 안전합니다. 여러 스레드가 동시에 쓰기 작업을 수행하는 경우 일반적으로 스레드 동기화가 필요합니다. 그렇지 않으면 스레드 안전성이 영향을 받을 수 있습니다.
(관련 튜토리얼 추천: java 입문 프로그램)
ArrayList 스레드가 왜 안전하지 않습니까? 안전하지 않다면 왜 사용합니까? 스레드 불안전성을 해결하는 방법은 무엇입니까?
ArrayList는 요소를 추가할 때 다음 두 단계로 완료될 수 있습니다.
1. Items[Size] 위치에 요소를 저장합니다.
2.
단일 스레드 작업의 경우 크기 = 0이면 요소를 추가한 후 요소는 위치 0 및 크기=1이 되며, 예를 들어 다중 스레드인 경우 두 개의 스레드, 스레드가 있습니다. A는 먼저 요소가 위치 0에 저장됩니다.
그러나 이때 CPU 스케줄링 스레드 A가 일시 중지되고 스레드 B가 실행될 기회를 얻습니다. 스레드 B도 이 ArrayList에 요소를 추가합니다. 왜냐하면 Size는 현재 여전히 0이기 때문입니다(요소를 추가하려면 두 단계가 필요하고 스레드 A는 1단계만 완료했다고 가정합니다). 따라서 스레드 B도 Stored at에 요소를 추가합니다. 위치 0. 그런 다음 스레드 A와 스레드 B가 모두 계속 실행되어 둘 다 Size 값이 증가합니다.
자, 이제 ArrayList의 상황을 살펴보겠습니다. 실제로는 위치 0에 요소가 하나만 저장되어 있지만 크기는 2입니다. 이것은 "안전하지 않은 스레드"입니다.
어떻게 해결하나요?
잠금(객체 잠금, 잠금 코드 블록), spin + CAS 방식(낙관적 잠금), java에서 제공하는 스레드로부터 안전한 데이터 클래스 사용
3 스레드를 생성하는 방법은 무엇입니까? 방법은 몇 개나 있나요?
1. Thread 클래스 상속
2. Runnable 인터페이스 구현
3. Callable 인터페이스 구현
4. 아니면 Thread 클래스를 상속받는 것이 더 낫습니까?
Runnable 인터페이스를 구현하는 것이 더 좋습니다.
1. Runnable 인터페이스를 구현하면 Java 단일 상속의 한계를 피할 수 있기 때문입니다.
클래스가 Thread를 상속하면 다른 클래스를 상속할 수 없습니다. 그리고 클래스가 Runnable을 구현하면 다른 클래스에서도 상속할 수 있습니다.
2. 객체 지향 설계에 더 가깝습니다
run() 메서드는 스레드에서 실행할 코드를 캡슐화하는 데 사용됩니다. 그런 다음 run() 메서드가 속한 개체는 스레드 작업 개체입니다. Thread 클래스의 하위 클래스 개체는 스레드 개체이자 스레드 작업 개체입니다. 결합력이 매우 강합니다.
Runnable 인터페이스를 사용하면 스레드 작업과 스레드를 분리하여 프로그램의 확장성을 향상시킬 수 있습니다.
(관련 영상 튜토리얼 추천: java 영상 튜토리얼)
5. sleep()과 wait()의 차이점은 무엇인가요?
sleep은 스레드 클래스(Thread)의 메서드이므로 이러한 문제가 발생합니다. 지정된 시간 동안 스레드의 실행을 일시 중단하여 다른 스레드에 실행 기회를 제공하지만 모니터링 상태는 계속 유지되며 시간 초과 후 자동으로 복원됩니다. sleep을 호출해도 객체 잠금이 해제되지 않습니다.
wait는 Object 클래스의 메서드입니다. 이 개체에 대해 wait 메서드를 호출하면 이 스레드가 개체 잠금을 포기하고 이 개체를 기다리는 대기 잠금 풀에 들어갑니다. 이 스레드는 알림 메서드 후에만 개체 잠금 풀에 들어갑니다. (또는 informAll)이 객체에 대해 발행되고 객체 잠금을 획득하고 실행 상태로 들어갈 준비를 합니다.
변수가 휘발성으로 선언되면 액세스할 때마다 주 메모리와 일관성이 유지됩니다. 변수가 동기화된 메서드 또는 동기화된 블록에서 액세스되면 입구에서 잠금을 얻을 때 잠금이 해제됩니다. 메서드나 블록 및 메서드나 블록이 종료되는 시점 시간 변수가 동기화됩니다.
위 내용은 고전적인 Java 인터뷰 질문 모음(5)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!