>  Q&A  >  본문

Java SE 다중 스레드 보안 문제의 원인은 무엇입니까?

사진 속 코드는 음수가 나올 확률이 낮을 수도 있는데, if문 뒤에 Thread.sleep(10)을 추가하면 음수가 출력되는 걸 볼 수 있습니다

阿神阿神2686일 전940

모든 응답(5)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-06-12 09:28:22

    무슨 질문을 하시는지 모르겠습니다. 여러 스레드가 동시에 리소스를 읽고 동기화되지 않는 문제가 발생하는 것은 정상입니다. 이는 다른 스레드가 값을 쓰는 동안 하나의 스레드가 값을 얻을 수 있기 때문입니다. 값으로 인해 동기화 문제가 발생합니다.

    가장 어리석은 방법은 코드 블록에 직접 동기화를 추가하고 전체 코드를 잠그는 것입니다. 더 좋은 방법은 AtomInteger이것과 같은 스레드 안전 클래스를 사용하여 동기화를 보장하는 것입니다. 멀티스레딩에 대한 연구 결과를 보면 그냥 추가할 수도 있습니다. 몇 가지 잠금만 사용하면 작업이 완료됩니다.

    회신하다
    0
  • 怪我咯

    怪我咯2017-06-12 09:28:22

    스레드 호출 순서는 순서가 보장되지 않습니다. 근본적인 이유는 JVM이 리소스를 조정할 때 스레드 간 전환에 있습니다.

    회신하다
    0
  • 習慣沉默

    習慣沉默2017-06-12 09:28:22

    핵심적인 이유는 CPU가 효율성을 높이기 위해 명령어를 재정렬하기 때문입니다

    회신하다
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-12 09:28:22

    num의 동기화는 없습니다. 현재 스레드가 num의 값을 변경한 후에 다른 스레드가 이를 즉시 볼 수 있다는 보장은 없습니다.
    대상 코드를 예로 들어보겠습니다. num=1이 끝까지 실행되고 3개의 스레드가 동시에 if 판단을 실행하여 모두 합격으로 판단할 수 있다고 가정하면 음수가 나타날 수 있습니다.

    회신하다
    0
  • 黄舟

    黄舟2017-06-12 09:28:22

    1. 메모리 가시성
    2. 수정의 원자성

    num은 정적 변수이므로 run() 메서드가 실행되면 복사본이 스택에 복사되어 저장됩니다. 그러나 실행 순서로 인해 한 스레드가 변수를 수정하고 씁니다. 힙의 num이 변경되었음에도 불구하고 다른 스레드는 이를 모르고 해당 복사본을 계속 수정하게 됩니다. 그런 다음 수정 사항이 힙에 기록되어 이전 스레드의 수정 사항을 덮어쓰게 되어 상태 불일치가 발생합니다.
    그렇다면 스레드 안전성이 보장될 수 있다면 어떨까요? 그런 다음 num을 수정하기 전에 힙 영역 수정의 가시성이 보장되는지 확인하고 수정하기 전에 복사본을 만드세요(이전에 복사한 경우에도). 이는 휘발성 키워드로 보장될 수 있습니다.

    원자성, num--의 실제 실행은 두 개의 작업이므로 실행 순서 문제가 발생합니다. 앞서 휘발성이 가시성을 보장하는 데 사용된다고 언급했지만. 그러나 다른 스레드가 수정 사항을 덮어쓰는 상황이 여전히 존재하지만 그 가능성은 더 적습니다. 원자성을 보장하는 방법은 동기화된 키워드, 잠금 메커니즘, JDK 동시성 툴킷 등을 사용할 수 있습니다. 이 상황에서 가장 간단한 해결책은

    으아악

    회신하다
    0
  • 취소회신하다