다중 스레드 응용 프로그램에서 원자 부울 사용

아키 너 알칸

다음 코드를 실행하려고합니다.

내 생성자에서 원자 부울을 초기화합니다.

Atomic Boolean isChannelActive = new AtomicBoolean(false);

내 쓰기 방법 에서이 부울을 확인하고 기다립니다.

public ChannelFuture write(ByteBuf msgBuf) {
if (!isChannelActive.get()) {
  try {
    wait();
  } catch (InterruptedException ex) {
    logger.Error("Waiting interrupted", ex);
  }
}

그러나 문제는이 원자 부울이 프로그램이 켜져있을 때 다른 스레드에서 설정할 수 있다는 것입니다.

if (!isChannelActive.get()) { 
  try{ --- Right on here and program made a context switch at this time.
    wait()

따라서이 시나리오에서 내 원자 부울은 true이고 notifyAll () 이벤트를 놓치고 컨텍스트 전환으로 인해 영원히 기다릴 것입니다.

이 문제를 어떻게 방지 할 수 있습니까?

동기화 된 블록이 옵션 일 수 있다는 것을 알고 있지만이 경우에 더 우아한 옵션을 찾고 있습니다.

OldCurmudgeon

다른 수준의 동기화 메커니즘을 혼합해서는 안됩니다.

  1. wait/notify-더 이상 사용할 필요가없는 구식 시스템입니다. 로 할 수있는 모든 wait/notify작업은 synchronized또는 Locks 로 수행 할 수 있습니다 .

  2. synchronized -이를 통해 독점 액세스가 필요한 섹션이 서로 간섭하지 않도록 코드를 동기화 할 수 있습니다.

  3. Locks-일반적으로 원하는 거의 모든 액세스 제어를 처리 할 수있는 다양한 유형의 잠금이 있습니다.

  4. Blocking... -이것은보다 현대적인 접근 방식입니다. 코드에 동기화를 두는 대신 데이터 구조를 사용하여 안전한 액세스를 보장합니다.

  5. 같은 기능의 추가 설정이 있습니다 PhaserSemaphore일반적인 메커니즘의 일부를 달성하는 데 사용할 수 있습니다.

당신은 사용 attemptin하는 atomicswait/notify동시에. 이것은 어려움 없이는 작동하지 않습니다.

아마도 Lock.

Lock channelActive = new ReentrantLock();

public void test() {
    channelActive.lock();
    try {
        // Do your exclusive stuff here.
    } finally {
        channelActive.unlock();
    }

}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자체 응용 프로그램에서 외부 응용 프로그램으로 텍스트 복사

분류에서Dev

gprof는 다중 스레드 응용 프로그램을 지원합니까?

분류에서Dev

응용 프로그램에서 Yii 다중 사용자 로그인

분류에서Dev

다중 스레드 응용 프로그램에서 ZeroMQ 처리 인터럽트

분류에서Dev

다중 스레드 응용 프로그램에서 잠금 및 잠금 해제

분류에서Dev

다중 스레드 응용 프로그램에서 재사용 가능한 코드의 타이머

분류에서Dev

백그라운드 작업자를 사용하여 다른 클래스에서 부울 응답 반환

분류에서Dev

스윙 응용 프로그램 다중 스레드 디자인 패턴 및 모범 사례

분류에서Dev

응용 프로그램별로 환경 변수를 조건부로 변경하여 Windows 사용자 문서 폴더에 스팸 폴더를 생성하는 프로그램을 중지합니다.

분류에서Dev

자유 서버에서 실행 스프링 부팅 응용 프로그램

분류에서Dev

다중 스레드 응용 프로그램의 프로세서 수 제한

분류에서Dev

(Spring) ThreadPoolTaskExecutor를 사용하는 다중 스레드 응용 프로그램

분류에서Dev

다중 스레드 (즉, 스레드 기반) Java 응용 프로그램에서 손상된 결과

분류에서Dev

중포 기지 Realtimedatabase에서 사용자를 삭제하면 안드로이드 응용 프로그램 충돌

분류에서Dev

다중 스레드 응용 프로그램의 정적 메서드

분류에서Dev

순수 사용자 수준 스레드 전략에서 다중 스레드 응용 프로그램이 다중 처리를 활용할 수없는 이유는 무엇입니까?

분류에서Dev

백그라운드 작업자를 사용한 후에도 내 응용 프로그램이 중단됩니다.

분류에서Dev

LDAP 사용자로 Ubuntu 16.04에서 스냅 응용 프로그램을 실행할 때 '권한 거부 됨'

분류에서Dev

다중 스레드 응용 프로그램에서 RichTextBox에 액세스하면 OutOfMemoryException이 발생합니다.

분류에서Dev

단일 스레드 CPU의 다중 스레드 응용 프로그램?

분류에서Dev

스레드는 응용 프로그램에 갇혀있다

분류에서Dev

NHibernate 데이터가 다중 스레드 응용 프로그램에서 동기화되지 않았습니다.

분류에서Dev

WPF 다중 창 응용 프로그램에서 사용자 설정을 동적으로로드하고 저장하는 방법은 무엇입니까?

분류에서Dev

Atom을 사용하면 응용 프로그램 자체 나 원래 편집기 탭에서 포커스를 변경할 수 없습니다.

분류에서Dev

JMeter에서 조건부로 사용자 스레드 중지

분류에서Dev

printf를 사용하지 않으면 다중 스레드 테스트 C 응용 프로그램이 중단됨

분류에서Dev

Linux에서 다른 사용자로 X 응용 프로그램 실행

분류에서Dev

Windows Forms 응용 프로그램에서 그룹 상자 컨트롤 내부에 그릴 수 없습니다.

분류에서Dev

다중 스레드 응용 프로그램의 로그 대기열

Related 관련 기사

  1. 1

    자체 응용 프로그램에서 외부 응용 프로그램으로 텍스트 복사

  2. 2

    gprof는 다중 스레드 응용 프로그램을 지원합니까?

  3. 3

    응용 프로그램에서 Yii 다중 사용자 로그인

  4. 4

    다중 스레드 응용 프로그램에서 ZeroMQ 처리 인터럽트

  5. 5

    다중 스레드 응용 프로그램에서 잠금 및 잠금 해제

  6. 6

    다중 스레드 응용 프로그램에서 재사용 가능한 코드의 타이머

  7. 7

    백그라운드 작업자를 사용하여 다른 클래스에서 부울 응답 반환

  8. 8

    스윙 응용 프로그램 다중 스레드 디자인 패턴 및 모범 사례

  9. 9

    응용 프로그램별로 환경 변수를 조건부로 변경하여 Windows 사용자 문서 폴더에 스팸 폴더를 생성하는 프로그램을 중지합니다.

  10. 10

    자유 서버에서 실행 스프링 부팅 응용 프로그램

  11. 11

    다중 스레드 응용 프로그램의 프로세서 수 제한

  12. 12

    (Spring) ThreadPoolTaskExecutor를 사용하는 다중 스레드 응용 프로그램

  13. 13

    다중 스레드 (즉, 스레드 기반) Java 응용 프로그램에서 손상된 결과

  14. 14

    중포 기지 Realtimedatabase에서 사용자를 삭제하면 안드로이드 응용 프로그램 충돌

  15. 15

    다중 스레드 응용 프로그램의 정적 메서드

  16. 16

    순수 사용자 수준 스레드 전략에서 다중 스레드 응용 프로그램이 다중 처리를 활용할 수없는 이유는 무엇입니까?

  17. 17

    백그라운드 작업자를 사용한 후에도 내 응용 프로그램이 중단됩니다.

  18. 18

    LDAP 사용자로 Ubuntu 16.04에서 스냅 응용 프로그램을 실행할 때 '권한 거부 됨'

  19. 19

    다중 스레드 응용 프로그램에서 RichTextBox에 액세스하면 OutOfMemoryException이 발생합니다.

  20. 20

    단일 스레드 CPU의 다중 스레드 응용 프로그램?

  21. 21

    스레드는 응용 프로그램에 갇혀있다

  22. 22

    NHibernate 데이터가 다중 스레드 응용 프로그램에서 동기화되지 않았습니다.

  23. 23

    WPF 다중 창 응용 프로그램에서 사용자 설정을 동적으로로드하고 저장하는 방법은 무엇입니까?

  24. 24

    Atom을 사용하면 응용 프로그램 자체 나 원래 편집기 탭에서 포커스를 변경할 수 없습니다.

  25. 25

    JMeter에서 조건부로 사용자 스레드 중지

  26. 26

    printf를 사용하지 않으면 다중 스레드 테스트 C 응용 프로그램이 중단됨

  27. 27

    Linux에서 다른 사용자로 X 응용 프로그램 실행

  28. 28

    Windows Forms 응용 프로그램에서 그룹 상자 컨트롤 내부에 그릴 수 없습니다.

  29. 29

    다중 스레드 응용 프로그램의 로그 대기열

뜨겁다태그

보관