>  기사  >  Java  >  Java 언어의 스레드 동기화 및 상호 배제 구현 방법

Java 언어의 스레드 동기화 및 상호 배제 구현 방법

WBOY
WBOY원래의
2023-06-10 09:43:361157검색

Java 언어는 초기에 멀티스레딩을 도입한 언어입니다. 스레드의 사용은 프로그램의 동시 처리에서 Java 언어를 빛나게 합니다. 그러나 스레드 간의 동기화 문제와 상호 배제 문제는 항상 프로그래밍 프로세스의 핵심이었습니다. Java 언어에는 스레드 동기화 및 상호 배제를 구현하는 방법이 많이 있습니다. 이 기사에서는 그 중 몇 가지를 소개합니다.

1. 동기화 및 상호 배제를 달성하려면 동기화 키워드를 사용하세요.

동기화는 Java 언어에서 동기화 및 상호 배제를 달성하는 가장 기본적인 방법입니다. Java에서는 각 개체에 모니터가 있습니다. 스레드가 모니터의 코드 블록에 들어가면 개체의 잠금을 획득하고 잠금 코드 블록을 실행해야 하는 다른 스레드는 대기만 할 수 있습니다. 하나의 스레드가 실행을 완료하면 해당 개체의 잠금이 해제되고 해당 개체를 기다리고 있는 다른 스레드가 코드 블록에 진입하여 위의 과정을 반복할 수 있습니다.

Synchronized를 사용한 구현은 비교적 간단합니다. 동기화해야 하는 메서드나 코드 블록 앞에 동기화 키워드를 추가하기만 하면 됩니다. 예:

public synchronized void method1(){
  //...
}

또는 코드 블록 사용:

public void method1(){
  synchronized(this) {
    //...
  }
}

동기화의 또 다른 형태는 클래스 잠금입니다. 클래스 잠금을 사용할 때 모니터는 동일한 클래스의 Class 객체입니다. 예:

public class MyClass {
  public static synchronized void method1(){
    //...
  }
}

위 코드에서 MyClass의 모든 인스턴스는 MyClass 클래스의 동일한 Class 개체를 공유합니다.

2. ReentrantLock을 사용하여 동기화 및 상호 배제

동기화 키워드와 달리 ReentrantLock은 키워드가 아닌 클래스입니다. ReentrantLock에는 동기화와 유사한 기능이 있지만 동기화 및 상호 배제 메커니즘에 대한 보다 강력한 제어 기능을 제공합니다. 이와 대조적으로 ReentrantLock을 사용하면 더 유연합니다. 예를 들어 공정한 잠금 획득을 달성하고 스레드에 의한 잠금 획득 횟수를 계산하는 등의 작업을 수행할 수 있습니다.

ReentrantLock은 다음과 같이 사용됩니다.

ReentrantLock lock = new ReentrantLock();
lock.lock();
try{
  //...
} finally {
  lock.unlock();
}

ReentrantLock은 재진입이 가능합니다. 즉, 동일한 스레드가 잠금을 여러 번 얻을 수 있습니다.

3. CountDownLatch를 사용하여 동기화 달성

CountDownLatch는 하나 이상의 스레드가 다른 스레드 또는 여러 스레드가 실행을 완료할 때까지 기다릴 수 있도록 하는 스레드 동기화용 도구 클래스입니다. CountDownLatch는 카운트다운 카운터를 제공합니다. 대기해야 하는 스레드는 Countdown() 메서드를 호출하여 카운터를 1씩 감소시켜야 합니다. 카운터가 0이면 대기 중인 스레드가 계속 실행될 수 있습니다.

CountDownLatch를 사용하면 한 스레드가 계속하기 전에 다른 스레드가 시작될 때까지 기다릴 수 있습니다. 예:

//初始化计数器为1
CountDownLatch latch = new CountDownLatch(1);

//线程1
new Thread(new Runnable() {
  public void run(){
    //其他操作
    latch.countDown();
  }
}).start();

//线程2等待线程1启动完毕
latch.await();

//线程2继续执行

4. 세마포어를 사용하여 동기화 및 상호 배제 달성

세마포어는 특정 리소스에 동시에 액세스하는 스레드 수를 제어할 수 있는 또 다른 Java 동시성 도구 클래스입니다. 세마포어는 스레드가 라이센스를 요청하면 라이센스를 받고 계속 실행할 수 있습니다. 라이센스가 모두 소모되면 계속하기 전에 다른 스레드가 라이센스를 반환할 때까지 기다려야 합니다.

세마포어를 사용하여 동시에 리소스에 액세스하는 스레드 수를 제한합니다. 예:

//初始化Semaphore,设定同时允许2个线程访问
Semaphore semaphore = new Semaphore(2);

//其他线程请求许可证
semaphore.acquire();

//许可证使用完毕后释放
semaphore.release();

요약:

위는 Java 언어에서 스레드 동기화 및 상호 배제를 달성하는 여러 가지 방법입니다. 그 중 동기화는 가장 기본적인 구현 방법인 ReentrantLock은 보다 강력한 제어 메커니즘을 제공하며, CountDownLatch 및 Semaphore는 스레드 간의 협업 및 동시성을 잘 제어할 수 있습니다. 실제 프로그래밍에서 이러한 도구를 합리적으로 선택하고 유연하게 사용하면 Java 프로그램의 스레드 동기화 및 상호 배제 문제를 효과적으로 피할 수 있습니다.

위 내용은 Java 언어의 스레드 동기화 및 상호 배제 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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