동기화, 대기 및 알림 사용을 중단해야 할 때입니까?


13

synchronized사용하는 것이을 사용하는 것보다 선호 되는 단일 시나리오 (고대 JVM과의 호환성 제외) 가 Lock있습니까? 누구나 새로운 시스템을 사용 wait하거나 그 notify이상의 것을 정당화 할 수 있습니까 ?

구현시 알고리즘 중 하나 를 사용해야 하는 알고리즘이 있습니까?

이 문제에 대해 언급 한 이전 질문을 보았지만 실제로 조금 더 나아가고 싶습니다 deprecate. 새로운 시설로 다림질 된 함정과 함정 및 경고가 너무 많습니다. 나는 그것들이 곧 쓸모없는 것으로 표시 될 때가되었다고 느꼈다.


4
실제로 Brian Goetz의 Java Concurrency를 읽었습니까? 그는 암묵적 vs 명시 적 잠금 토론을 훌륭하게 다루고 있습니다.
— Martijn Verburg

@MartijnVerburg-슬프게도 나는 그의 작품에 대해 큰 존경심을 가지고 있습니다.
— OldCurmudgeon

1
동기화 된 키워드는 스레드 안전 해야하는 간단한 정적 메소드와 함께 유용 할 수 있습니다. 그러나 이것은 내 의견이다
— Kemoda

답변:


12

구현시 알고리즘 중 하나를 사용해야하는 알고리즘이 있습니까?

거의 확실하지 않습니다. (사실, 이론적 인 관점에서, 당신은. / 기타있는 java.util.concurrent를 사용하여 통지 시뮬레이션 대기 할 수 있어야 . 당신이 잠금 해제에주의해야하지만 ... 클래스. 그리고 명시 적으로 잠금 작업으로 대체 될 수 동기화 finally조항.)

그러나 Java에서 최상의 성능을 구현하려면 대기 및 알림 여부와 상관없이 동기화 된 직접 사용과 관련된 알고리즘 이 있을 수 있습니다.


동기화, 대기 및 알림 사용을 중단해야 할 때입니까?

이전 질문에 대한 답에 관계없이 대답은 확실히 아니오입니다.

대기 / 알림은 올바르게 사용될 수 있습니다 (그리고 종종 사용됩니다). Java에서는 폐기 된 클래스 및 메소드에 대해 더 이상 사용되지 않습니다. 즉, 지속적인 사용이 시급한 문제로 수정되어야하는 경우. Sun (및 현재 Oracle)이 기본적으로 사용되지 않고 대기 / 알림만큼 널리 사용된다면 막대한 양의 레거시 코드에 심각한 호환성 문제가 발생할 수 있습니다. 그것은 누군가의 관심사가 아닙니다.

코드에서 동기화 / 대기 / 알림을 제거하려면 괜찮습니다. 그러나 더 이상 사용되지 않을 경우 본질적으로 올바른 멀티 스레드 코드를 대량으로 다시 작성해야하므로 BAD IDEA가 될 것입니다. 기업 IT 관리자와 소프트웨어 제품 관리자는 그것을 제안하는 당신을 미워할 것입니다 ...


Java 문서에 따라 "더 이상 사용되지 않음"의 의미를 읽을 가치가 있습니다. http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html

또한 Java의 핵심 요소 인 더 이상 사용되지 않는 것에 대해 이야기하고 있습니다. 사용 중단 synchronized은 큰 결과를 초래합니다.


사실, "실제로 Java 동시성"책에 따르면 java.util.concurrent유틸리티 클래스는 실제로 더 빠릅니다. 뒤에서이 클래스는 VM과 직접 통신합니다. 여기서 VM은 동기화 될 때 객체 그래프의 객체에 무딘 잠금을 설치하여 글로벌 성능에 영향을줍니다.
— akuhn

우리가 실제로 synchronizedet를 제거한다는 제안으로 건너 갔다면 @Stephen을 용서하십시오 . 알. 나는 더 이상 사용 중단을 제안하고 있으며, 실제로는 새로운 코드에는 이것을 사용하지 않는다고 말합니다. 나는 제거가 요구되는 레거시 코드를 손상시키고 시험해 보라고 제안하는 것을 꿈꾸지 않을 것입니다.
— OldCurmudgeon

@OldCurmudgeon-늦은 응답이지만 사용 중단이 너무 극단적이라고 생각합니다. 1) 기능 을 제거 할 수 있음을 의미합니다 . 2) 단지 구식과는 다른 기능이 손상되었음을 나타냅니다. 3) 많은 사람들이 여전히 그런 식으로 새 코드를 작성하는 것을 기쁘게 생각합니다 ... 그렇지 않아야 할 강력한 이유가 없습니다. 4) 낙담하는 다른 "당신의 얼굴에"다른 방법이있다; 예 : PMD 규칙 작성 ...
— Stephen C

@StephenC-그렇다면 우리가 취할 수있는 약간 덜 극적인 행동이 결국에는 대학에서 사용되거나 가르치지 않을 것입니다. 분명히 피해야합니다. PMD 규칙은 좋은 생각이지만 교사에게 매우 빨리 도달하지 못할 것으로 생각합니다.
— OldCurmudgeon

1
@StephenC nitpick : 링크 된 Java 문서로 이동하면 더 이상 사용되지 않는 코드가 더 이상 사용되지 않는 코드라고 생각하지 않습니다. 그 이유 중 하나이지만 문서에서 알 수 있듯이 API가 더 새롭고 더 나은 API로 대체되면 API가 더 이상 사용되지 않을 수 있습니다 (OP가 주장하는 것처럼 동시성이 있습니다). 실제로 나쁜 관행을 장려하지 않을 경우 그리고 낮은 수준의 동시성, 확실히 매우 발생하기 쉬운 오류가 발생했습니다.
— Andres F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.