Java 잠금 재입력 가능 잠금 설명
4. 잠금 재입력 가능:
본고는 JAVA 아래의 ReentrantLock만 가리키는 것이 아니라 넓은 의미의 재입력 자물쇠를 말한다.
자물쇠를 다시 입력할 수 있는 것을 귀속 자물쇠라고도 하는데 같은 라인 외층 함수가 자물쇠를 얻은 후에도 내층 귀속 함수는 이 자물쇠를 가져오는 코드가 있지만 영향을 받지 않는다.
JAVA 환경에서 ReentrantLock과synchronized는 모두 재입력 자물쇠입니다.
다음은 사용 인스턴스입니다.
public class Test implements Runnable{
public synchronized void get(){
System.out.println(Thread.currentThread().getId());
set();
}
public synchronized void set(){
System.out.println(Thread.currentThread().getId());
}
@Override
public void run() {
get();
}
public static void main(String[] args) {
Test ss=new Test();
new Thread(ss).start();
new Thread(ss).start();
new Thread(ss).start();
}
}
두 가지 예의 마지막 결과는 모두 정확하다. 즉, 같은 스레드 id가 두 번 연속 출력된다.결과는 다음과 같습니다.
Threadid: 8
Threadid: 8
Threadid: 10
Threadid: 10
Threadid: 9
Threadid: 9
자물쇠를 다시 넣을 수 있는 가장 큰 작용은 자물쇠가 사라지는 것을 피하는 것이다.우리는 자전거 자물쇠를 예로 삼는다.
public class SpinLock {
private AtomicReference<Thread> owner =new AtomicReference<>();
public void lock(){
Thread current = Thread.currentThread();
while(!owner.compareAndSet(null, current)){
}
}
public void unlock (){
Thread current = Thread.currentThread();
owner.compareAndSet(current, null);
}
}
자물쇠의 경우:1. 같은 라인에서 lock () 를 두 번 호출하면 두 번째 lock 위치를 자전하는 자물쇠가 생길 수 있다
이 자물쇠가 다시 들어갈 수 있는 것이 아니라는 것을 설명한다.(lock 함수에서 자물쇠가 잠긴 라인인지 확인해야 함)
2. 만약에 1 문제가 해결되었다면 unlock () 이 처음 호출되었을 때 자물쇠를 풀었습니다.실제로는 자물쇠를 풀어서는 안 된다.
(계수 회로 집계)
수정하면 다음과 같습니다.
public class SpinLock1 {
private AtomicReference<Thread> owner =new AtomicReference<>();
private int count =0;
public void lock(){
Thread current = Thread.currentThread();
if(current==owner.get()) {
count++;
return ;
}
while(!owner.compareAndSet(null, current)){
}
}
public void unlock (){
Thread current = Thread.currentThread();
if(current==owner.get()){
if(count!=0){
count--;
}else{
owner.compareAndSet(current, null);
}
}
}
}
이 자물쇠는 다시 들어갈 수 있는 자물쇠입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.