java 라인 공정 자물쇠와 비공정 자물쇠 상세 및 실례 코드

java 라인 공평 자물쇠와 비공평 자물쇠 상세 설명
ReentrantLock에서 볼 수 있듯이 동기화는 두 가지가 있는데 그것이 바로 공평한 FairSync와 비공평한 NonfairSync이다.공평한 자물쇠의 역할은 라인이 시작되는 순서에 따라 엄격하게 집행하는 것이고 다른 라인이 끼어들어 집행하는 것을 허락하지 않는다.공평한 자물쇠가 아니라 새치기를 허용한다.
기본적으로 ReentrantLock은 비공평한 자물쇠를 통해 동기화됩니다. synchronized 키워드를 포함하여 모두 이렇습니다. 성능이 더 좋기 때문입니다.라인이 RUNNABLE 상태에 들어갔기 때문에 실행할 수 있고 실제 라인까지 실행하는 데는 비교적 오랜 시간이 걸린다.그리고 자물쇠가 풀리면 다른 라인은 자물쇠를 다시 가져와야 합니다.그 중에서 자물쇠를 가진 라인은 자물쇠를 방출하고 다른 라인은 걸어서 RUNNABLE 상태로 복구하며 다른 라인은 자물쇠를 요청하고 자물쇠를 얻으며 라인은 실행하는 일련의 절차를 거쳤다.만약 이때 라인이 직접 자물쇠를 요청하면 RUNNABLE 상태를 회복하는 데 걸리는 소모를 피할 수 있기 때문에 성능이 더욱 최적화된다.

  /**
   * Creates an instance of {@code ReentrantLock}.
   * This is equivalent to using {@code ReentrantLock(false)}.
   */
  public ReentrantLock() {
    sync = new NonfairSync();
  }
ReentrantLock () 을 사용하는 기본 상태는 비공평한 잠금입니다.다음 코드를 참고하십시오. ReentrantLock의 자물쇠 가져오기 작업은 장식 모드를 통해sync에 에이전트됩니다.

 /**
   * Acquires the lock.
   *
   * <p>Acquires the lock if it is not held by another thread and returns
   * immediately, setting the lock hold count to one.
   *
   * <p>If the current thread already holds the lock then the hold
   * count is incremented by one and the method returns immediately.
   *
   * <p>If the lock is held by another thread then the
   * current thread becomes disabled for thread scheduling
   * purposes and lies dormant until the lock has been acquired,
   * at which time the lock hold count is set to one.
   */
  public void lock() {
    sync.lock();
  }
다음은 FairSync와 NonfairSync가 lock 방법에 대한 실현을 참고하십시오.

 /**
   * Sync object for non-fair locks
   */
  static final class NonfairSync extends Sync {
    /**
     * Performs lock. Try immediate barge, backing up to normal
     * acquire on failure.
     */
    final void lock() {
      if (compareAndSetState(0, 1))
        setExclusiveOwnerThread(Thread.currentThread());
      else
        acquire(1);
    }
  }

  /**
   * Sync object for fair locks
   */
  static final class FairSync extends Sync {
    final void lock() {
      acquire(1);
    }
  }

비공평한 자물쇠를 사용할 때 즉시 상태를 설정하려고 시도합니다. 성공하면 새치기하여 실행하고, 실패하면 공평한 자물쇠의 메커니즘과 같이acquire () 방법을 호출하여 배타적인 방식으로 자물쇠를 가져옵니다. 성공하면 바로 되돌아옵니다. 그렇지 않으면 라인을 대기열에 넣고 성공적으로 호출될 때까지 알 수 있습니다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기