이 기사에서는 주로 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(); } }
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(); } }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!