Java 잠금 재입력 가능 잠금 설명

자물쇠는 공유 데이터를 병발하고 일치성을 확보하는 도구로 JAVA 플랫폼에서 여러 가지 실현이 있다(예를 들어synchronized와ReentrantLock 등).이미 작성된 자물쇠는 우리의 개발에 편의를 제공했지만 자물쇠의 구체적인 성질과 유형은 거의 언급되지 않았다.이 시리즈는 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);
   }

  }

 }
}

이 자물쇠는 다시 들어갈 수 있는 자물쇠입니다.

좋은 웹페이지 즐겨찾기