Java 멀티스레드 프로그래밍의 Lock 사용 사례

자물쇠는 여러 개의 루트가 공유 자원에 접근하는 것을 제어하는 도구이다.일반적으로 자물쇠는 공유 자원에 대한 독점적인 접근을 제공한다.한 번에 하나의 라인만 자물쇠를 얻을 수 있으며, 공유 자원에 대한 모든 접근은 먼저 자물쇠를 얻어야 한다.단, 일부 자물쇠는 공유 자원에 대한 동시 접근을 허용할 수 있습니다. 예를 들어 ReadWriteLock (관련 자물쇠 한 쌍을 유지하고 하나는 읽기 전용 작업, 다른 하나는 쓰기 작업) 의 읽기 전용 자물쇠입니다.
1. Lock은 무조건적이고 윤문할 수 있으며 정해진 시간에 끊길 수 있는 자물쇠 획득 조작을 제공하며 모든 자물쇠를 채우고 잠금을 해제하는 방법은 현저하다.

public interface Lock{
  void lock(); // 
  // , 
  void lockInterruptibly() throws InterruptedException;
  boolean tryLock(); // 
  boolean tryLock(long timeout,TimeUnit unit) throws InterruptedException;
  void unlock(); // 
  Condition newCondition();
}
2. ReentrantLock은 lock 인터페이스를 실현했고synchronized에 비해 ReentrantLock은 사용할 수 없는 자물쇠를 처리하는 데 더 많은 유연성을 제공했다.
3. lock 인터페이스를 사용하는 규범적인 형식은finally 블록에서 자물쇠 lock을 방출해야 한다.unlock().만약 자물쇠 수호 코드가try 블록 밖에서 이상을 던졌다면, 그것은 영원히 방출되지 않을 것이다.
다음 아날로그 Lock 사용법: 두 개의 라인(A라인, B라인)이 print(Stringname) 방법을 호출한다고 가정하면 A라인은'zhangsan'문열을 출력하고, B라인은'lisi'문열을 출력합니다.
1. print(String name) 방법에 자물쇠를 채우지 않으면 A 라인이 실행되지 않고 B 라인이 실행되기 시작하면 인쇄된name에 다음과 같은 문제가 발생합니다.
2. print(String name) 방법에 자물쇠를 넣으면 A 실행이 끝난 후에 B 라인이 print(String name) 방법을 실행하여 상호 배척 또는 동기화 효과를 얻는다.

package com.ljq.test.thread;
 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 *  Lock synchronized
 *
 * @author Administrator
 *
 */
public class LockTest {
 
  public static void main(String[] args) {
    new LockTest().init();
  }
 
  private void init() {
    final Outputer outputer = new Outputer();
    //A 
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
          try {
            Thread.sleep(10);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          outputer.output("zhangsan");
        }
 
      }
    }).start();
 
    //B 
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
          try {
            Thread.sleep(10);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          outputer.output("lisi");
        }
 
      }
    }).start();
 
  }
 
  static class Outputer {
    Lock lock = new ReentrantLock();
 
    /**
     *  
     *
     * @param name
     */
    public void output(String name) {
      int len = name.length();
      lock.lock();
      try {
        for (int i = 0; i < len; i++) {
          System.out.print(name.charAt(i));
        }
        System.out.println();
      } finally {
        lock.unlock();
      }
    }
  }
}


좋은 웹페이지 즐겨찾기