스레드 안전성에 관해 이야기할 때 이를 해결하기 위해 잠금 방법을 선택합니다. Java의 잠금 유형은 6가지 유형으로 나누어집니다. 우리가 접한 가장 일반적인 두 가지 잠금 방법은 잠금과 동기화입니다. 이는 인터뷰에서 가장 자주 묻는 원칙 및 메커니즘 질문이기도 합니다. 아래에서는 Java의 일반적인 인터뷰 질문을 모두 답변할 수 있는지 살펴보겠습니다.
1.정적 방법과 비정적 방법의 동기화 효과의 차이점
비정적 메서드:
객체를 잠급니다 (이 객체의 메모리를 잠그는 것으로 이해될 수 있습니다. 이는 이 메모리일 뿐이며 다른 유사한 객체도 자체 메모리 잠금을 갖습니다). 이때 객체의 동기화 방법은 둘 이상의 메모리에서 실행됩니다. 다른 스레드(참고: 개체)는 상호 배제를 생성합니다.
정적 메서드 : 클래스를 잠그는 것과 같습니다(*.class는 코드 영역에 있고 정적 메서드는 정적 영역에 있습니다. 이 클래스에 의해 생성된 개체는 이 정적 메서드를 공유하므로 N개 개체가 이 메모리를 두고 경쟁합니다).
이때 , 이 클래스에 의해 생성된 객체가 호출되는 한, 이 정적 메서드가 호출되면 상호 배제가 발생합니다. 즉, 이 클래스의 모든 객체는 잠금을 공유합니다.
2.잠금 유형은 무엇입니까?
(1) 낙관적 잠금 및 비관적 잠금
(2) 스핀락 & 논스핀락
(3) 재진입 잠금 및 비재진입 잠금
(4) 무잠금식 및 경량형 잠금장치 및 편향형 잠금장치 및 중량형 잠금장치
(5) 뮤텍스 잠금 및 공유 잠금
(6) 공정한 잠금과 불공정한 잠금
3. 스레드 동기화의 여러 가지 방법
동기화된 수정
휘발성은 동기화를 구현합니다(원자성은 보장되지 않고 가시성만 보장됨).
지역 변수 ThreadLocal 사용
원자 클래스 사용( AtomicInteger, AtomicBoolean...)
잠금 사용
컨테이너 클래스( BlockingQueue, ConcurrentHashMap)
4. 동기화 메커니즘과 잠금 메커니즘의 차이점
동기화는 원래 CPU 비관적 잠금 메커니즘을 사용했습니다. 즉, 스레드가 배타적 잠금을 획득했습니다. 배타적 잠금은 다른 스레드가 스레드가 잠금을 해제할 때까지 기다리기 위해 차단에만 의존할 수 있음을 의미합니다.
잠금은 낙관적 잠금을 사용합니다. 소위 낙관적 잠금은 충돌이 없다고 가정하고 매번 잠금을 수행하지 않고 작업을 완료하는 것입니다. 충돌로 인해 실패하면 성공할 때까지 재시도합니다. 낙관적 잠금을 구현하는 메커니즘은 CAS 작업(비교 및 교환)입니다.
5. 스레드 안전 문제에 대해 이야기
스레드 안전성(Thread Safety)은 멀티스레딩 분야에서 이슈가 되는 문제입니다. 스레드 안전성은 간단히 말해 멀티스레딩 환경에서 문제 없이 사용할 수 있는 메소드나 인스턴스로 이해하면 됩니다.
Java 다중 스레드 프로그래밍 에서는 Java 스레드 안전성을 달성하는 여러 가지 방법이 제공됩니다.
가장 간단한 방법은 동기화 키워드를 사용하는 것입니다 .
AtomicInteger와 같은 java.util.concurrent.atomic 패키지의 원자 클래스를 사용합니다 .
java.util.concurrent.locks 패키지의 잠금 사용
스레드로부터 안전한 컬렉션 ConcurrentHashMap 사용
변수 가시성을 보장하려면 휘발성 키워드를 사용하세요 .
이상은 Java의 Lock에 관한 면접 질문에 대한 소개입니다. 자신이 잘 모르는 지식 포인트에 대해서는 제때에 정보를 찾아 해결하고 Lock 내용에 대한 기억을 강화해야 합니다.