>  기사  >  Java  >  Java의 뮤텍스 세마포어 및 다중 스레드 대기 메커니즘의 예

Java의 뮤텍스 세마포어 및 다중 스레드 대기 메커니즘의 예

黄舟
黄舟원래의
2017-09-22 11:54:081930검색

이 기사에서는 주로 Java 프로그래밍의 뮤텍스 잠금, 세마포어 및 다중 스레드 대기 메커니즘 예제를 소개합니다. 뮤텍스 잠금과 세마포어의 차이점을 간략하게 소개합니다.

뮤텍스 잠금 및 세마포어는 운영 체제의 동시 프로그래밍을 위해 설계된 기본 개념입니다. 뮤텍스 잠금과 세마포어의 개념적 차이점은 동일한 리소스에 대해 뮤텍스 잠금은 0과 1의 개념만 갖는다는 것입니다. 거기서 멈추지 마세요. 즉, 세마포어는 동시에 여러 스레드에서 리소스에 액세스할 수 있도록 하는 반면, 뮤텍스는 동시에 하나의 스레드에서만 액세스할 수 있습니다. Java에서 뮤텍스를 구현하는 방법은 동기화된 스레드에 액세스할 때입니다. 리소스의 객체는 tryLock() 메서드를 통해 이 잠금을 획득해야 합니다. 실패하면 false를 반환하고 성공하면 true를 반환합니다. 반환된 정보를 기반으로 동기화된 리소스에 대한 액세스 여부를 결정합니다. 아래 예를 보세요


public class ReentranLockExample {
 private static int count = 0;
 private static ReentrantLock reentrantLock = new ReentrantLock();
 static class MyThread extends Thread{
  @Override
  public void run() {
   super.run();
   try {
    while (true){
     boolean result = reentrantLock.tryLock();
     if (result){
      System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count ++);
      reentrantLock.unlock();
     }else{
      System.out.println(Thread.currentThread().getName() + "get the lock failed and run the syn code " + count);
     }
     System.out.println(Thread.currentThread().getName() + "run the asyntronized code " + count);
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  thread1.start();
  thread2.start();
 }
}

스레드가 리소스에 액세스하려면 먼저 이 리소스의 세마포를 가져와야 하며 세마포 내부의 카운터는 1씩 감소합니다. 세마포어 내부의 카운터가 0보다 크면 사용할 수 있는 리소스가 있다는 의미입니다. 스레드가 리소스 사용을 마치면 해당 리소스의 세마포어를 해제해야 합니다. 세마포어의 기능 중 하나는 특정 리소스에 액세스하기 위한 스레드를 지정하는 것입니다. 초기화만 하면 됩니다.


Java에서 세마포어 구현은

Semaphore이며, 초기화 중에 정수로 전달되어 동기화 리소스에 대한 최대 동시 액세스를 지정합니다.


public class SemaphoreExample {
 private static Semaphore semaphore = new Semaphore(2);
 private String lock = "lock";
 private static int count = 0;
 static class MyThread extends Thread {
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     semaphore.acquire();
     Thread.sleep(500);
     System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count++);
     semaphore.release();
     Thread.sleep(500);
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread();
  MyThread thread2 = new MyThread();
  MyThread thread3 = new MyThread();
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

CountDownLatch는 참석자가 대기할 때까지 기다리는 것과 같은 대기 메커니즘을 구현합니다. 도착해서 회의를 시작하세요. ConutDownLatch는 초기화 시 대기할 개수를 지정하는 카운터입니다. 동시 프로그래밍에서 해결해야 할 문제는 모든 스레드가 특정 지점에 도달할 때까지 기다리는 것입니다. 회의와 조금 비슷한 다음 단계를 시작하세요. 회의는 모든 참가자가 도착해야만 시작할 수 있습니다


public class CountDownLatchExample {
 private static CountDownLatch mCountDownLatch = new CountDownLatch(3);
 static class MyThread extends Thread {
  int awaitTime;
  public MyThread(int i) {
   this.awaitTime = i;
  }
  @Override
  public void run() {
   super.run();
   try {
    while (true) {
     Thread.sleep(awaitTime);
     System.out.println(Thread.currentThread().getName() + "arrived " );
     mCountDownLatch.countDown();
     mCountDownLatch.await(); //可以指定等待时间
     System.out.println(Thread.currentThread().getName() + "start meeting " );
    }
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }
 public static void main(String[] args){
  MyThread thread1 = new MyThread(500);
  MyThread thread2 = new MyThread(1000);
  MyThread thread3 = new MyThread(2000);
  thread1.start();
  thread2.start();
  thread3.start();
 }
}

요약

위 내용은 Java의 뮤텍스 세마포어 및 다중 스레드 대기 메커니즘의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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