>  기사  >  Java  >  Java 다중 스레드 프로그래밍의 잠금 사용 예

Java 다중 스레드 프로그래밍의 잠금 사용 예

高洛峰
高洛峰원래의
2017-01-05 15:58:191135검색

잠금은 공유 리소스에 대한 여러 스레드의 액세스를 제어하는 ​​도구입니다. 일반적으로 잠금은 공유 리소스에 대한 독점 액세스를 제공합니다. 한 번에 하나의 스레드만 잠금을 획득할 수 있으며 공유 리소스에 대한 모든 액세스에는 먼저 잠금을 획득해야 합니다. 그러나 일부 잠금은 ReadWriteLock(한 쌍의 관련 잠금을 유지하는 읽기-쓰기 잠금, 하나는 읽기 전용 작업용이고 다른 하나는 쓰기 작업용)과 같은 공유 리소스에 대한 동시 액세스를 허용할 수 있습니다.

1. 잠금은 무조건적, 폴링 가능, 시간 지정 및 중단 가능 잠금 획득 작업을 제공합니다. 모든 잠금 및 잠금 해제 방법은 명시적입니다.

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은 잠금 인터페이스를 구현합니다. 동기화에 비해 ReentrantLock은 사용할 수 없는 잠금을 처리하는 데 더 많은 유연성을 제공합니다.
3. 잠금 인터페이스를 사용하는 표준 형식에서는 finally 블록에서 잠금 lock.unlock()을 해제해야 합니다. 잠금을 보호하는 코드가 try 블록 외부에서 예외를 발생시키면 절대로 해제되지 않습니다.

다음은 잠금 사용을 시뮬레이션합니다. print(문자열 이름) 메서드를 호출하는 두 개의 스레드(A 스레드, B 스레드)가 있고, 스레드는 'zhangsan' 문자열 인쇄를 담당하고, B 스레드는 'lisi' 문자열을 인쇄하는 일을 담당합니다.
1. print(문자열 이름) 메소드가 잠겨 있지 않으면 스레드 A가 실행을 완료하지 않고 스레드 B가 실행을 시작한 경우 인쇄된 이름에 다음과 같은 문제가 발생합니다.

2. print(문자열 이름) 메소드에 잠금이 추가되면 스레드 B는 A가 실행을 완료한 후에만 print(문자열 이름) 메소드를 실행하여 상호 배제 또는 동기화 효과를 얻습니다.

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();
      }
    }
  }
}

Java 멀티 스레드 프로그래밍의 Lock 사용 예제와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트에 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.