2017-03-06 1 views
0

인용구 :휘발성 읽기가 항상 비 혼란스러운 이유는 무엇입니까? 실제로 책 자바 동시성에서

동기화의 성능 비용은 여러 소스에서 비롯됩니다. 동기화 및 휘발성에 의해 제공되는 가시성 보증은 캐시를 플러시 또는 무효화하고 하드웨어 쓰기 버퍼를 플러시하고 실행 파이프 라인을 지연시킬 수있는 메모리 장벽이라는 특수 명령어를 사용하여 수행 할 수 있습니다. 메모리 장벽은 다른 컴파일러를 금지하기 때문에 간접적 인 성능 결과를 가질 수도 있습니다. 최적화; 대부분의 작업은 메모리 장벽으로 재정렬 할 수 없습니다. 동기화의 성능 영향을 평가할 때 은 경합과 비 동기화를 구별하는 데 중요합니다 ( 동기화). 동기화 된 메커니즘은 비연 소 케이스 (휘발성은 항상 비 호환)에 맞게 최적화되어 있으며이 글에서 대부분의 시스템에 대해 "고속 경로"의 성능 비용은 동기화 범위가 20에서 250 클록주기입니다.

더 명확히 할 수 있습니까? volaile 변수를 읽는 방대한 양의 스레드가 있다면 어떻게합니까?

경합 정의를 제공 할 수 있습니까?

저울질 도구가 있습니까? 어느 값에서 측정 값입니까?

답변

3

더 명확히 할 수 있습니까?

많은 주제를 다루는 하나의 고밀도 단락입니다. 명확한 설명을 요구하는 주제는 무엇입니까? 귀하의 질문은 만족스럽게 대답하기에는 너무 광범위합니다. 죄송합니다.

지금, 당신은 질문하는 경우 경쟁이 없었던 동기화에 고유 한, 그것은 JVM 내에서 스레드를 차단하지 않는 것을 의미한다 얻을 차단을 해제/통지 한 후 다시 차단 된 상태로 이동합니다. 후드 아래에서

는 JVM은 하드웨어 특정 메모리 A를 volatile 필드는 항상 읽고에/메인 메모리에서가 아닌 CPU/코어 캐시에서 작성

  1. 확인 장벽 및
  2. 를 사용하여 귀하의 스레드는 액세스를 차단/차단 해제하지 않습니다.

경합이 없습니다. 동기화 된 블록 OTH를 사용하면 모든 스레드는 동기화 된 블록에 의해 보호되는 데이터를 읽는 것을 제외하고는 차단 된 상태가됩니다.

동기화 된 데이터에 액세스하는 스레드 인 스레드 A를이라고합시다.이제

, 여기 스레드이 데이터를 수행하고 동기화 된 블록을 존재하는 키커이며,이/스레드을 기다리고 있었다있다 일어나 모든 다른 스레드에 JVM의 원인 동기화 블록을 종료합니다.

모두 깨어나고 (CPU와 메모리가 비쌉니다.) 그리고 그들은 모두 동기화 블록을 잡으려고 경쟁하고 있습니다.

작은 방에서 붐비는 방을 나가려는 사람들이 많다고 상상해보십시오. 그래, 그런 식으로 스레드가 동기화 잠금을 잡으려고 할 때 스레드가 작동하는 방식입니다.

그러나 오직 하나만 들어 와서 들어갑니다. 다른 모든 사람들은 차단 상태 인에서 잠자기로 돌아갑니다. 이것은 또한 값 비싼 자원 현명한 것입니다.

그래서 하나의 스레드가 동기화 블록으로 존재할 때마다 다른 모든 스레드는 미친 듯이 (내가 생각할 수있는 최상의 정신적 이미지) 접근하여 하나의 액세스를 얻고 다른 모든 스레드는 차단 된 상태로 돌아갑니다 상태.

그것이 동기화 된 블록을 비싸게 만드는 이유입니다. 자, 여기 경고가 있습니다 : 예전 JDK 1.4 이전에는 매우 비쌌습니다. 17 년 전입니다. Java 1.4는 몇 가지 개선 사항 (2003 IIRC)을 시작했습니다.

그런 다음 Java 1.5는 12 년 전인 2005 년에 훨씬 향상된 기능을 도입하여 동기화 된 블록의 비용을 줄였습니다.

이러한 사항을 염두에 두는 것이 중요합니다. 많은 구식 정보가 있습니다.

가변 길이의 스레드를 읽었을 때 어떻게해야합니까?

정확성 측면에서 그다지 중요하지 않습니다. volatile 필드는 스레드 수에 관계없이 항상 일관된 값을 표시합니다. 당신이 스레드의 매우 많은 경우

이제 성능이 때문에 컨텍스트 스위치, 메모리 사용률 등 (그리고 반드시 및/또는 주로 때문에 volatile 필드를 액세스의 고통을 수 있습니다.

을 할 수 당신은

가 길을 잘못 복용하지 마십시오? 경합 정의를 제공하지만, 당신이 그 질문을하는 경우, 당신은 당신이 읽고있는 것과 같은 책을 사용하는 것이 완벽하게 준비가되지 않습니다 두려워 해요.

동시성 및 경합에 대한보다 기본적인 소개가 필요합니다.

https://en.wikipedia.org/wiki/Resource_contention

감사합니다.

+0

좋은 답변입니다. 당신은'synchronized' 블록에 대해서 이야기하지만 잠금 오버 헤드에 대해서는 충분하지 않습니다. 블로킹 토론과 함축되어 있지만 동기화 된 잠금을 잡고 누른 다음 해제하는 것이 성능에 미치는 영향을 언급하는 것이 좋습니다. 또한 스레드가 동기화 된 블록을 종료 할 때 하나의 스레드 만 차단됩니다. – Gray

+0

또한 "다른 모든 스레드가 액세스 할 수 있도록 미친 듯이 (가장 좋은 정신적 이미지가 있습니다.") 잘못되었습니다. 스레드가 잠금을 해제하면 잠금 대기중인 큐의 첫 번째 스레드 (있는 경우)가 잠금을받습니다. 모든 스레드는 깨우 치지 않고 그것을 해결하지 않습니다. – Gray

관련 문제