>  기사  >  Java  >  14가지 일반적인 인터넷 Java 인터뷰 질문

14가지 일반적인 인터넷 Java 인터뷰 질문

(*-*)浩
(*-*)浩원래의
2019-11-15 16:31:282401검색

14가지 일반적인 인터넷 Java 인터뷰 질문

1.동기화 및 재진입 잠금 유사점과 차이점

동일점

둘 다 다중 스레드 동기화 및 메모리 가시성 의미 체계를 구현하며 둘 다 재진입 잠금입니다

차이

구현 메커니즘 다양한 동기화 Java 개체 헤드 잠금 표시 및 모니터 개체를 통해 재진입 잠금을 구현합니다. CAS, ASQ(AbstractQueuedSynchronizer) 및 잠금 지원(차단 및 차단 해제용)을 통해 ASQ를 통한 재진입 잠금을 포함한 다중 스레드 메모리 가시성을 보장합니다. 휘발성 상태는 공유 변수를 포함하는 멀티스레드 메모리의 가시성을 보장합니다

동기화는 다양한 방식으로 사용되며 인스턴스 메서드(잠금 인스턴스 개체), 정적 메서드(잠금 클래스 개체), 코드 블록(지정된 잠금 개체 표시) 재진입 잠금 표시 호출을 수정할 수 있습니다. trylock()/lock() 메서드의 경우 finally 블록에서 잠금을 해제해야 합니다. reentrantlock

은 잠금 대기 시간 제한(만료 시간 설정), 중단 가능한 잠금(lockInterruptously)을 제공합니다. ), 조건(대기, 신호 및 기타 메소드 제공) 등. 풍부한 의미의 재진입 잠금은 대기 시간을 설정할 수 없고 중단할 수 없는 동기화를 구현하기 위해 공정한 잠금과 불공정한 잠금을 제공합니다. 2. 동시 해시맵이 잠금 없이 읽히는 이유는 무엇입니까? 둘 다 final 타입이고 노드는 테이블 헤드에서만 삽입하거나 삭제할 수 있습니다

2) HashEntry 클래스의 값 필드는 휘발성으로 선언됩니다3) 키와 값으로 Null이 허용되지 않습니다. 읽기 스레드가 특정 항목을 읽습니다. HashEntry의 값 필드 값이 null인 경우 충돌이 발생했음을 알 수 있습니다. 재정렬 현상이 발생했으며(새 값 개체의 바이트코드 명령을 재정렬하도록 설정) 잠금이 필요합니다.

4 ) 휘발성 변수 count는 읽기 및 쓰기 스레드 간의 메모리 가시성을 조정하며, 읽기 작업은 전이성 원칙에 따라 먼저 카운트를 읽습니다. , 쓰기 작업의 수정은 읽기 작업으로 볼 수 있습니다

jdk1.8

1) 노드의 val과 next는 모두 휘발성입니다

2) tabAt 및 casTabAt에 해당하는 안전하지 않은 작업은 휘발성 의미를 구현합니다

3. ContextClassLoader(스레드 컨텍스트 클래스 로더)

의 역할은 클래스 로더의 부모를 재정의합니다. 클래스를 로드하는 위임 메커니즘(예: 서비스 로더 구현)은 스레드 컨텍스트 클래스 로더를 사용하여 여러 클래스 사이에 클래스 로더가 있는지 확인합니다. 서로 다른 클래스 로더로 인해 발생하는 유형 변환 예외(ClassCastException)를 방지하려면 통신해야 하는 스레드가 동일해야 합니다. )

4. Tomcat 클래스 로딩 메커니즘

서로 다른 애플리케이션은 애플리케이션 격리를 달성하기 위해 서로 다른 웹앱 클래스 로더를 사용합니다. webapp 클래스 로더는 jsp 클래스 로더입니다. 다른 애플리케이션에서 공유하는 jar 패키지는 클래스 로더/공유 디렉토리 아래에 배치될 수 있습니다.

5. osgi 클래스 로딩 메커니즘

osgi 클래스 로딩 모델은 메시형이며 각 애플리케이션에 위임할 수 있습니다. 모듈 간 기타(번들)

osgi 모듈식 핫 배포를 달성하는 핵심은 클래스 로더 메커니즘의 구현입니다. 각 번들에는 자체 클래스 로더가 있습니다. 번들을 교체해야 할 경우 번들과 클래스 로더가 함께 교체됩니다. 코드의 핫 교체를 달성하기 위해

클래스 로딩 요청이 수신되면 osgi는 다음 순서로 클래스 검색을 수행합니다: 1) java.*로 시작하는 클래스는 로딩을 위해 상위 클래스 로더에 위임됩니다

2 ) 그렇지 않으면 위임 목록 목록(구성 파일 org.osgi.framework. bootdelegation에 정의된 클래스)이 로드를 위해 상위 클래스 로더에 위임됩니다

3) 그렇지 않으면 Import-Package에 선언되어 있는지 확인하세요.

4) 그렇지 않으면 Import-Package에 선언되어 있는지 확인하고, Require-Bundle에 선언되어 있는지 확인하고, 그렇다면 클래스 로딩 요청을 위임합니다. 필요한 번들의 클래스 로더에 추가

5) 그렇지 않으면 현재 번들의 ClassPath를 찾아서 자신의 클래스 로더를 사용하여 로드합니다.

6) 그렇지 않으면 클래스가 자체 조각 번들에 있는지 확인합니다. 로드를 위해 조각 번들의 클래스 로더에 위임

7) 그렇지 않으면 번들의 Dynamic Import-Package(동적 가져오기는 실제로 사용될 때만 이 패키지를 로드함)를 찾아 다음의 클래스 로더에 위임합니다. 해당 번들을 로딩

8) 그렇지 않으면 클래스 검색이 실패합니다

6. 실행 중인 스레드를 종료하는 방법

이 플래그 변수는 여러 스레드에 표시되어야 합니다.

인터럽트를 사용하세요. , isInterrupted()와 결합

7. threadlocal 사용 시나리오 및 문제

threadlocal은 다중 스레드 공유 변수의 문제를 해결할 수 없습니다. 동일한 threadlocal에 포함된 개체는 서로 다른 스레드에 서로 간섭하지 마십시오. other

트랜잭션 및 데이터베이스 연결 연결과 같은 동일한 스레드에서 변수를 여러 번 읽을 수 있도록 하는 스레드 컨텍스트 변수를 저장하는 데 사용됩니다. 웹 프로그래밍에서 더 많이 사용됩니다.

질문: 스레드 풀 시나리오에서는 스레드 로컬을 사용합니다. 실제 변수 값은 스레드의 threadlocalmap 유형 변수에 저장되며, 해당 값을 먼저 제거하거나 설정하지 않으면 이전 값을 얻을 수 있습니다

문제: 스레드 풀 시나리오의 메모리 누수에 주의하세요. threadlocal의 가져오기/설정은 키를 사용하여 항목을 지우지만(키는 threadlocal의 약한 참조이고, 값은 강력한 참조이므로 값이 그렇지 않게 됩니다.) 출시 예정)이지만 제거하는 것이 가장 좋습니다

8 스레드 풀 시작부터 작업까지의 과정

처음에는 작업을 추가할 때:

1) 실행 중인 스레드 수가 핵심 매개변수 corePoolSize보다 적으면 이를 실행하기 위한 스레드를 계속 생성합니다. task

2) 그렇지 않고 실행 중인 스레드 수가 corePoolSize보다 크거나 같으면 작업을 차단 대기열에 추가합니다

3) 그렇지 않으면 대기열이 가득 차고 동시에 실행되는 스레드 수가 핵심 매개 변수 maximumPoolSize보다 적으면 작업을 실행하기 위해 스레드를 계속 생성합니다

4 ) 그렇지 않으면 대기열이 가득 차고 실행 중인 스레드 수가 동시에 maximumPoolSize보다 크거나 같은 경우 설정된 거부 정책에 따라 처리됩니다

5) 하나의 작업을 완료하고 다음 작업을 계속 처리합니다

# 🎜🎜# 6) 처리를 계속할 작업이 없거나 스레드가 중단되거나 스레드 풀이 닫히면 스레드가 실행을 종료합니다. 스레드 풀이 닫히면 스레드가 종료됩니다

7) 그렇지 않으면 결정합니다. 스레드 풀이 실행 중인지 여부 스레드 수가 코어 스레드 수보다 큰지 여부, 그렇다면 스레드가 종료되고, 그렇지 않으면 스레드가 차단됩니다. 따라서 모든 스레드 풀 작업이 실행된 후 남은 스레드 풀 크기는 corePoolSize

9입니다. BlockingQueue take와 poll

의 차이는 다음과 같습니다. poll(time): BlockingQueue의 첫 번째 개체를 가져옵니다. 즉시 가져올 수 없는 경우 시간 매개변수에 지정된 시간 동안 기다릴 수 있습니다. 가져올 수 없으면 null

#🎜이 반환됩니다. 🎜#take(): BlockingQueue 제거 BlockingQueue의 첫 번째 개체는 BlockingQueue가 비어 있으면 새 개체가 BlockingQueue에 추가될 때까지 차단합니다.

10. 차단하지 않고 FutureTask의 결과

get(long timeout,TimeUnit 단위), 시간 초과가

Polling을 반환할 때 먼저 isDone()을 사용하여 그것이 맞는지 확인합니다. 완료한 후 get()을 호출하세요

# 🎜🎜#11.blockingqueue 중요한 데이터가 저장되어 있는 경우 시스템 다운타임 처리 방법

번거롭습니다 지속성을 위해 프로덕션 데이터를 디스크에 유지해야 합니다. 소비자 스레드는 디스크에서 메모리 차단 큐로 데이터를 로드하고 시작 시 데이터를 로드합니다. 소비 오프셋에 따라 디스크에서 꺼내 메시지가 손실되지 않도록 메시지 대기열에 추가하고 시퀀스 번호를 생성하며 멱등성을 소비합니다. 소비 프로세스는 시스템이 다시 시작된 후 생산 상태를 결정합니다#🎜🎜 #

12. NIO와 기존 I/O의 차이점

은 스레드를 저장하고 NIO는 원본을 사용합니다. 각 스레드는 읽기 및 쓰기를 차단해야 합니다. 단일 스레드(예: Selector)는 여러 채널 등록(레지스터)의 관심 이벤트(SelectionKey) 수집을 처리합니다(하위 계층은 운영 체제에서 제공하는 epoll()에 의존함). netty bossgroup은 연결 승인, 작업자 그룹을 처리합니다. NIO는 특정 비즈니스 프로세스와 데이터 읽기 및 쓰기를 처리합니다. 기존 I/O는 데이터를 스트림 방식으로 처리하는 반면 NIO는 데이터를 블록 방식으로 처리합니다. -힙 버퍼. 읽고 쓸 때 먼저 버퍼에 배치된 다음 채널을 통해 커널에 의해 반대쪽 끝으로 전송됩니다. #🎜🎜 #13. 목록에 저장됨 반복 가능한 문자열, 특정 문자열 삭제 방법

반복된 삭제를 삭제하는 반복자 관련 메서드를 호출하여 긍정으로 인한 배열 재배열을 방지합니다. 시퀀스 삭제, 배열 요소 건너뛰기 문제#🎜🎜 #

14. GC ROOTS가 무엇인가요(일상적인 개발과 관련된 메모리 누수는 이와 관련된 것입니다)

#🎜 🎜#현재 모든 Java 스레드의 활성 스택 프레임 GC 힙에는 개체에 대한 참조가 있으므로 사용되지 않는 개체는 메모리 재활용 효율성을 높이기 위해 시간에 null로 설정됩니다.

정적 변수에서 참조하는 개체이므로 정적 변수, 특히 정적 컬렉션 변수의 크기를 줄입니다. 컬렉션에 저장된 개체는 지속적인 증가를 방지하기 위해 euqls() 및 hashcode()를 덮어씁니다.

로컬 메서드 JNI에서 참조하는 개체 #🎜 🎜#Objects는 메소드 영역의 상수에 의해 참조되므로 긴 문자열에서 Call String.intern()

classloader를 줄여 클래스 객체를 로드하므로 사용자 정의 클래스 로더가 유효하지 않은 경우 다음으로 설정됩니다. 시간이 지나면 null이 되고 클래스 로더 로딩 객체 간의 격리에 주의하세요. jvm의 일부 정적 GC 힙의 객체에 대한 데이터 구조 참조

위 내용은 14가지 일반적인 인터넷 Java 인터뷰 질문의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.