CodeGym /Java Course /모듈 3 /동기화 장치: Java에서 리소스에 대한 액세스 동기화

동기화 장치: Java에서 리소스에 대한 액세스 동기화

모듈 3
레벨 19 , 레슨 4
사용 가능

신호기

세마포어는 일반적으로 파일 시스템으로 작업할 때 스레드 수를 제한해야 할 때 사용됩니다. 파일 또는 기타 공유 리소스에 대한 액세스는 카운터를 통해 제어됩니다. 값이 0보다 크면 액세스가 허용되지만 동시에 카운터가 감소합니다.

카운터가 0을 반환하는 순간 현재 스레드는 다른 스레드가 리소스를 해제할 때까지 차단됩니다. 권한 매개변수의 수는 생성자를 통해 설정해야 합니다.

컴퓨터나 노트북의 전원에 따라 이 매개변수를 개별적으로 선택해야 합니다.

public class Main {

   public static void main(String[] args) {
       Semaphore sem = new Semaphore(1);
       CommonResource res = new CommonResource();
       new Thread(new MyThread(res, sem, "MyThread_1")).start();
       new Thread(new MyThread(res, sem, "MyThread_2")).start();
       new Thread(new MyThread(res, sem, "MyThread_3")).start();
   }
}

class CommonResource {
   int value = 0;
}

class MyThread implements Runnable {
   CommonResource commonResource;
   Semaphore semaphore;
   String name;
   MyThread(CommonResource commonResource, Semaphore sem, String name) {
       this.commonResource = commonResource;
       this.semaphore = sem;
       this.name = name;
   }

   public void run() {

       try {
           System.out.println(name + "waiting permission");
           semaphore.acquire();
           commonResource.value = 1;
           for (int i = 1; i < 7; i++) {
               System.out.println(this.name + ": " + commonResource.value);
               commonResource.value++;
               Thread.sleep(150);
           }
       } catch (InterruptedException e) {
           System.out.println(e.getMessage() + " " + name);
           Thread.currentThread().interrupt();
       }
       System.out.println(name + "releases permission");
       semaphore.release();
   }
}

CountDownLatch 및 기타

CountDownLatch - 다른 스레드에서 수행된 특정 수의 작업이 완료될 때까지 여러 스레드가 대기할 수 있습니다. 예를 들어 응용 프로그램 설치가 있습니다. 사용 약관에 동의하고 새 프로그램을 설치할 폴더를 선택할 때까지 응용 프로그램이 시작되지 않습니다. 이를 위한 특별한 countDown() 메서드가 있습니다 . 이 메서드는 카운트다운 카운터를 하나씩 감소시킵니다.

카운트가 0이 되는 즉시 await의 모든 대기 스레드는 작업을 계속하고 이후의 모든 await 호출은 기다리지 않고 통과됩니다. 카운트다운 카운터는 일회성 카운터이며 재설정할 수 없습니다.

CyclicBarrier - 주어진 수의 스레드를 한 지점에서 동기화하는 데 사용됩니다. N개의 스레드가 await(...) 메서드를 호출하고 차단하면 장벽에 도달합니다. 그런 다음 카운터가 원래 값으로 재설정되고 대기 중인 스레드가 해제됩니다. 또한 필요한 경우 스레드 차단을 해제하고 카운터를 재설정하기 전에 사용자 지정 코드를 실행할 수 있습니다. 이를 위해 Runnable 인터페이스를 구현한 객체가 생성자를 통해 전달됩니다 .

Exchanger<V> Exchanger 클래스는 스레드 간의 데이터 교환을 위한 것입니다. 스레드가 교환해야 하는 데이터 유형을 입력하고 입력합니다.

데이터는 이 클래스의 유일한 exchange() 메서드를 사용하여 교환됩니다 .

V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

x 매개변수는 교환할 데이터 버퍼를 나타냅니다. 메서드의 두 번째 형식은 또한 timeout 매개 변수 , timeout 및 timeout 매개 변수 에 사용할 시간 단위 유형인 unit을 정의합니다 .

Phaser 클래스를 사용하면 전체 작업 실행에서 단일 단계 또는 단계를 나타내는 스레드를 동기화할 수 있습니다. Phaser는 특정 단계가 완료될 때까지 기다리는 동기화 개체를 정의합니다. 그런 다음 Phaser는 다음 단계로 이동하고 다시 완료될 때까지 기다립니다.

Phaser 클래스 로 작업할 때 먼저 객체를 만드는 것이 일반적입니다. 다음으로 모든 참가자를 등록해야 합니다. 각 참가자를 등록하려면 register() 메서드를 호출 하거나 필요한 수의 참가자를 Phaser 생성자에 전달하여 이 메서드 없이 수행할 수 있습니다 .

그런 다음 각 참가자는 단계를 구성하는 특정 작업 집합을 수행합니다. 그리고 Phaser 동기화 장치는 모든 참가자가 단계 실행을 완료할 때까지 기다립니다. 단계가 종료되었음을 동기화 프로그램에 알리려면 참가자는 arrive() 또는 arriveAndAwaitAdvance() 메서드를 호출해야 합니다 . 그런 다음 동기화 장치는 다음 단계로 이동합니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION