문제

저는 Java를 처음 접했고 그 내용을 읽었습니다. synchronized Java에서는 "매우 비쌉니다".내가 알고 싶은 것은 무엇이 비싸고 어떻게 비싼지입니다.

감사해요.

도움이 되었습니까?

해결책

어쩌면 생각만큼 나쁘지는 않을지도 몰라

그것은 끔찍했습니다(아마도 그것이 "매우 비쌌다"고 읽은 이유일 것입니다).이 밈은 사라지는 데 오랜 시간이 걸릴 수 있습니다

동기화 비용은 얼마나 됩니까?

캐시 플러시 및 무효화와 관련된 규칙으로 인해 Java 언어의 동기화된 블록은 일반적으로 원자성 "테스트 및 비트 설정" 기계 명령으로 구현되는 많은 플랫폼에서 제공하는 임계 섹션 기능보다 비용이 더 많이 듭니다.프로그램에 단일 프로세서에서 실행되는 단일 스레드만 포함된 경우에도 동기화된 메서드 호출은 동기화되지 않은 메서드 호출보다 여전히 느립니다.동기화에 실제로 잠금 경합이 필요한 경우 여러 스레드 스위치와 시스템 호출이 필요하므로 성능 저하가 상당히 커집니다.

다행스럽게도 JVM의 지속적인 개선으로 전반적인 Java 프로그램 성능이 향상되고 각 릴리스와의 상대적인 동기화 비용이 감소했으며 향후 개선이 예상됩니다.또한 동기화의 성능 비용이 과장되는 경우가 많습니다.한 잘 알려진 소식통은 동기화된 메서드 호출이 동기화되지 않은 메서드 호출보다 50배나 느리다고 언급했습니다.이 진술이 사실일 수도 있지만 이는 오해의 소지가 있으며 많은 개발자가 동기화가 필요한 경우에도 동기화를 피하게 만듭니다.

그렇긴 하지만, 동시 프로그래밍은 여전히 ​​느릴 수 있지만 현재 순전히 Java의 잘못은 그다지 많지 않습니다.미세한 잠금과 거친 잠금 사이에는 균형이 있습니다.너무 거친 것은 분명히 좋지 않지만 잠금 장치에는 비용이 0이 아니기 때문에 너무 미세한 것도 가능합니다.

경합 중인 특정 리소스를 고려하는 것이 중요합니다.기계식 하드 디스크는 스레드가 많을수록 더 나쁜 성능.

다른 팁

스레드를 사용하는 경우 많은 스레드가 동기화 된 코드 섹션을 통과 해야하는 경우 한 번에 하나만 실행될 수 있기 때문에 비싸다.

병목 현상과 같습니다.

단일 스레드를 사용하면 비싸다. 어쨌든 그가 실행할 수 있는지 확인해야하기 때문이다.

동기화 된 세그먼트 사용을 줄이면 스레드가 실행할 수 있는지 확인하기 위해 중지 할 필요가 없습니다 (물론 데이터를 공유 할 필요는 없습니다).

동기화 작동 방식에 대한 높은 수준의 개요를 찾을 수 있습니다. 여기

http://img20.imageshack.us/img20/2066/monitor28synchronizatioc.png

자바 스타일 모니터

이것은 Java에만 국한되지 않습니다. 동기화는 올바르게 수행하지 않으면 다중 스레드 환경에서 "비싼"것으로 간주 될 수 있습니다. Java에서 특히 나쁘지 않은지 모르겠습니다.

동일한 자원을 사용하면 스레드가 동시에 실행되는 것을 방지합니다. 그러나 그들은 하다 동일한 자원을 사용하면 더 나은 옵션이 없습니다 (수행해야 함).

문제는 사람들이 종종 너무 큰 범위로 자원을 보호한다는 것입니다. 예를 들어, 잘못 설계된 프로그램은 배열의 각 개별 요소 (또는 배열 섹션)가 아닌 전체 객체 배열을 동기화 할 수 있습니다.

이것은 요소 7을 읽으려고하는 스레드가 스레드 읽기 또는 쓰기 요소 22를 기다려야한다는 것을 의미합니다. 동기화의 세분성이 배열 레벨 대신 요소 레벨에 있으면 두 스레드는 서로 방해하지 않습니다.

두 스레드가 액세스하려고 할 때만 같은 요소는 자원 경합이있을 것입니다. 그렇기 때문에 일반적인 규칙은 가능한 한 작은 자원 만 보호하는 것입니다 (물론 동기화 수에 대한 제한이 적용됩니다).

그러나 솔직히 말해서, 대안이 단일 리소스와 싸우는 두 스레드로 인한 데이터 손상이라면 대안이 얼마나 비싼지는 중요하지 않습니다. 응용 프로그램을 올바르게 작성하고 성능 문제가 나타나는 경우에만 걱정하십시오 ( "먼저 작동하십시오. 그 다음에 빨리 작동하게하십시오.

이것 기사 IBM에서 실제로 동기화의 주요 요점을 매우 훌륭하게 요약합니다.

캐시 플러싱 및 무효화와 관련된 규칙으로 인해 Java 언어의 동기화 된 블록은 일반적으로 많은 플랫폼에서 제공하는 중요한 섹션 시설보다 일반적으로 원자력 "테스트 및 세트 비트"기계 명령으로 구현됩니다. 프로그램에 단일 프로세서에서 실행되는 단일 스레드 만 포함 된 경우에도 동기화 된 메소드 호출은 동기화되지 않은 메소드 호출보다 여전히 느립니다. 동기화가 실제로 잠금에 대한 경합이 필요한 경우, 여러 스레드 스위치 및 시스템 호출이 필요한 여러 스레드 스위치와 시스템 호출이 있기 때문에 성능 페널티가 실질적으로 더 큽니다.

다른 답변은 복제를 시도하지 않을 것이라는 수준의 기술적 세부 사항을 제공합니다.

내가 할 일은 기사의 날짜와 저자의 묵시적 능력과 인식)을 확인하도록 조언하는 것입니다. Java의 동기화 ~였다 이전 JVMS에서는 매우 느립니다. 그러나 최근에도 개선되어 비정규 동기화가 생각보다 훨씬 빠르고 비 계정 동기화도 향상되었습니다.

이 질문은 중요하지 않을 것입니다. 정확성을 보장하기 위해 동기화해야한다면 필요 정확성을 보장하기 위해 동기화합니다. 속도가 문제가되는 것을 볼 수있는 유일한 시간은 대신 잠금 구현을 만드는 것을 고려하고 있다면 (매우 효율적이면서도 복잡한 사용 java.util.concurrent.locks.abstractqueuedsynchronizer) 또는 아마도 작업에 다른 언어 사용을 대신 고려하는 것입니다.

일반적으로 가장 좋은 결론은 동기화가 일반적으로 첫 번째 반복에 사용하기에 충분히 빠르다는 것입니다. 모든 성능 문제와 마찬가지로, 처음에는 선명도와 정확성을위한 코드를 코드 한 다음 응용 프로그램의 비싼 부분으로 측정 한 내용 만 최적화하십시오. 일반적으로 이것은 동기화 비용이 아닙니다*.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top