Interviewer : ReentrantLock과 Synchronized의 차이점에 대해 알려주세요.

목차

사용하는 방법

실현하는 방법

공정하고 불공평

재진입 잠금

인터럽트 가능

조건부 대기열

요약하자면


안녕하세요 여러분! 다시 만나요. 인터뷰당혹 스러움 을 피하기 위해 오늘은 ReentrantLock과 Synchronized의 차이점에 대해보다 대중적인 언어로 이야기하겠습니다!

 

사용하는 방법


Synchronized는 인스턴스 메서드, 정적 메서드 및 코드 블록을 수정할 수 있습니다. 잠금이 자동으로 해제됩니다.

ReentrantLock은 일반적으로 try에서 잠금을 획득하고 finally에서 잠금을 해제하기 위해 try catch finally 문이 필요합니다. 잠금수동으로 해제 해야합니다 .

 

실현하는 방법


동기화는 헤비급 잠금입니다. Heavyweight 잠금은 커널 모드와 사용자 모드의 스레드를 앞뒤로 전환해야 합니다. 예 : A 스레드가 B 스레드로 전환되고 A 스레드는 현재 장면을 저장해야하며 B 스레드 전환도 장면을 저장해야합니다. 이것의 단점은 시스템 자원을 소비한다는 것 입니다.

ReentrantLock은 경량 잠금입니다. cas + volatile을 사용하여 스레드를 관리 하면 스레드 전환이 필요하지 않습니다. 잠금을 획득 한 스레드는 확실히 성공할 것이라고 생각 합니다. 이것은 낙관적 인 생각입니다 (실패 할 수 있음).

이미지 예제를 사용하여 설명하십시오. 예를 들어, 제 기사를 읽을 때 "heavyweight lock"의 개념이 명확하지 않다고 생각하므로 즉시 "heavyweight lock"에 대한 다른 기사를 읽은 다음 나중에 다시 돌아가십시오. 다음에서는이 동작을 핸드 오버라고합니다. 장면을 저장한다는 것은 당신의 두뇌가 점프 한 지점을 기억하고 계속해서 읽는 것을 의미합니다. 기사의 길이가 길면 두뇌가 기억해야 할 것이 많을수록 신경이 더 많이 소모됩니다. 같은 방식으로 경량 자물쇠에서는 "무거운 자물쇠"의 개념이 명확하지 않다고 느낍니다. 그는 다른 기사를 즉시 읽지 않을 것입니다. 그는 잠시 동안 계속 읽을 것입니다. 정말 이해가 안된다면, 정보로 이동하십시오. 다음은 두 가지 사고 방식입니다 . 전자는 비관적 잠금을 수동 차단하고, 상태는 차단하고, 후자는 낙관적 잠금을 능동적으로 차단하고, 상태는 대기입니다.

공정하고 불공평


동기화에는 불공정 한 잠금 만 있습니다.

ReentrantLock은 공정 및 불공정 잠금을 모두 제공하며 기본값은 불공정입니다. 공정한 잠금은 생성자를 통해 true로 전달됩니다.

이미지 예제를 사용하여 다음을 설명하십시오. 저녁 식사를 위해 대기 중, Synchronized는 대기열에서 점프를 허용합니다. ReentrantLock이 공정한 잠금이면 대기열에서 점프 할 수 없습니다.

 

재진입 잠금


Synchronized와 ReentrantLock은 모두 재진입이 가능하며, Synchronized는 C ++로 구현 된 기본 메소드이고 ReentrantLock은 Java로 구현 된 JUC 패키지입니다.

이미지 예를 사용하여 설명합니다. 다음 그림 : 방 안에있는 방, 방 안팎에 자물쇠가 있지만 유일한 열쇠 만 열 수 있고, 열쇠를 가진 사람은 입구 1에 들어갈 수 있습니다. 문 2를 입력하십시오. 여기서 입구 문 2는 자물쇠입니다.

ReentrantLock에서 재진입 수는 정수 상태로 표시됩니다. 1 회 입력하고 1 회 증가, 1 회 나오고 1 회 감소.

image.png

 

 

인터럽트 가능


동기화는 중단되지 않습니다.

ReentrantLock은 중단 가능하고 중단 불가능한 방법을 제공 합니다. lockInterruptibly에 있어서 인터럽트 수단 및 록 수단 정전 방법.

이미지 예를 사용하여 설명 : 리안에게 전화를 걸어 리안 여자 친구에게 핵산을 함께 걸고, 리안 여자 친구에게 앞에서 전화를 걸어 문에 들어올 때 먼저 리안 여자 친구에게 전화를 걸고, 기다리는 동안 갑자기 리더에게 전화를받습니다. 문 밖에서 버그를 고치기 위해 돌아가고 싶다면 Calling Lian에 이제 두 가지 옵션이 있습니다. 1. 여자 친구에게 인사하지 말고 즉시 버그를 수정하십시오. 2. 여자 친구가 핵산을 끝낼 때까지 기다리십시오. 산성, 가서 여자 친구에게 인사하고 버그를 수정하기 위해 돌아가십시오. 이 두 가지 상황은 결국 훈련이 핵산을 완성 할 수없는 결과로 이어질 것입니다. 두 경우 모두 지도자가 훈련을 중단하더라도 첫 번째 상황은 훈련이 즉시 지도자에게 피드백되어 중단 될 수 있다는 것입니다. 두 번째 상황 Jia Lian은 한 마리의 개가되지 않기 위해 인사를하고 버그를 수정했습니다. "hello"는 미리 잠금을 획득해야합니다. 즉, Jia를 기다려야합니다. 리안의 여자 친구가 핵산 검사를 완료했습니다. 만약 당신이라면 연습과 같은 상황에 직면하면 어떻게하겠습니까? 귀하의 회신을 기대하겠습니다! 주의하세요. 길을 잃지 마세요. 저는 Lian [공식 계정]이라고 부르며 전화를 걸어 연습하고 있습니다.

 

조건부 대기열


동기화됨에는 대기 대기열이 하나만 있습니다.

ReentrantLock의 하나의 잠금은 여러 조건 대기열에 대응할 수 있습니다. newCondition으로 표현됩니다.

이미지 예를 사용하여 다음을 설명합니다. 산란계와 산란계는 생산자와 소비자에 해당합니다. 암탉이 알을 낳은 후에는 암탉이 알을 줍는 사람에게 알려야합니다. 조건 대기열 (대기 대기열). 계란 선택기가 알을 줍는 작업을 마치면 계란 선택기는 암탉에게 계속 알을 낳도록 알려야합니다. 계란을 줍는 과정에서 암탉도 조건부 대기열에서 기다려야합니다.

 

 

참고 : 설명해야 할 몇 가지 개념이 있습니다. 동기화 대기열, 조건 대기열 및 대기 대기열.

동기 대기열 : 여러 스레드가 동시에 잠금 실패를 놓고 경쟁하며 일시 중단 된 스레드입니다.

조건부 큐 : 호출을 실행중인 스레드가 대기 / 대기하고 동기화 큐에서 참여한 스레드가 조건부 큐에 들어갑니다. 실행중인 스레드에서 signal / signalAll / notify / notifyAll을 호출하면 하나 이상의 조건 ​​큐 스레드가 동기화 큐에 추가됩니다.

대기 대기열 : 조건부 대기열이있는 개념.

 

 

요약하자면


오늘 우리는 이해하기 쉬운 텍스트로 ReentrantLock과 Synchronized의 관계를 설명했습니다. 마음에 들면 좋아요와 댓글을 남겨주세요! 주의하세요. 길을 잃지 마세요. 저는 Lian [공식 계정]이라고 부르며 전화를 걸어 연습하고 있습니다. 다음에 뵙기를 기대합니다!

tempimage1611629165941.gif

추천

출처blog.csdn.net/duyabc/article/details/113175705