2009-09-08 5 views
4

브라이언 게츠 (Brian Goetze)의 Java Concurrency in Practice에서 동시성 패턴을 읽었으며 코드 쓰레드를 안전하게 만들 때가 언제인지 혼란스러워했습니다.내 모든 Java 코드를 threadsafe로 설정해야합니까?

보통 쓰레드 안전성과 동기화에 대해 걱정할 필요가 없도록 코드를 작성합니다. 그러나 같은 코드를 언젠가 나중에 다시 사용할 수있는 가능성이 있습니다. 멀티 스레드 환경.

제 질문은 스레드 안전성에 대해 생각해야 할 때입니다. 처음부터 최악의 상황을 가정하고 항상 처음부터 스레드 안전 코드를 작성해야합니까? 아니면 코드를 다시 방문하여 나중에 필요할 경우 스레드 안전을 위해 수정해야합니까?

나중에 다중 스레드 환경에서 사용되는 경우 내 코드가 손상되지 않도록 단일 스레드 응용 프로그램을 작성하는 중에도 항상 알고 있어야하는 동시성 패턴/반 패턴이 있습니까?

+1

http : // stackoverflow와 다소 비슷합니다.com/questions/234341/should-i-always-make-my-java-code-thread-safe-or-for-performance-reasons-do-it-o – Mnementh

답변

12

코드가 다중 스레드 환경에서 사용될 때 스레드 안전성을 고려해야합니다. 단일 스레드 환경에서만 실행될 경우 복잡성을 해결할 필요가 없습니다.

  1. 조쉬 블로흐가 말했듯이, Favor Immutability :

    말했다되고, 당신은 좋은 사례 어쨌든 것을 할 수있는 멀티 쓰레딩에 도움이되는 간단한 일이있다. 변경할 수없는 클래스는 거의 정의에 의해 스레드 안전합니다.

  2. 편의가 아닌 필요한 경우에만 데이터 멤버 또는 정적 변수를 사용하십시오.
+2

+1. 또한 스레드 안전성에는 일반적으로 성능 저하가 따른다. 나는 일반적으로 thread-safe 한 다른 클래스와 패키지를 공유 할 때 스레드에 안전하지 않은 클래스를 문서화하려고 노력한다. 그래서 표준에 대한 예외가 명백하다. –

+0

숫자 2는 스레드 안전성을 향상시키는 방법 – hhafez

+1

함수가 두 스레드에 의해 호출되고 공유 상태를 사용하는 경우에는 충돌이 문제가됩니다. 그러나 그들이 의지하는 유일한 상태가 자신이 창조하거나 전달하는 것이라면 논쟁은 없습니다. – cletus

4

코드 스레드 안전성을 높이려면 클래스가 여러 스레드에서 동시에 사용할 수 있도록 설계되지 않았다는 주석을 추가하는 것만 큼 간단합니다. 즉, 모든 클래스는 스레드로부터 안전해야합니다.

그러나 실제로 많은 유형이 로컬 변수로만 참조되는 단일 스레드에서만 사용됩니다. 프로그램 전체가 멀티 스레드 인 경우에도 마찬가지입니다. 멀티 스레드 접근을 위해 모든 객체를 안전하게 만드는 것은 실수입니다. 페널티는 적지 만 보급률이 높고 수정하기 어려운 성능 문제가 될 수 있습니다.

+1

+1은 디자인 의도를 설명하기 위해 주석 사용을 언급합니다. –

+0

"주석 추가"는 "코드 스레드 안전성 확보"와 동일하다고 말하지 않습니다. 후자는 클래스 자체가 필요한 모든 동기화를 처리 함을 의미합니다. 코드가 스레드로부터 안전한지 여부와 관계없이 Javadoc의 주석은 다른 프로그래머에게 시간과 노력을 덜어줍니다. :) –

2

"효과적인 Java", 2 판을 얻으실 것을 권합니다. 조슈아 블로흐. 이 책은 동시성 (synchrony)에 대한 모든 장을 다룬다. 동기화 할시기 (언제 그렇지 않을 것인지)에 대한 확실한 탐구를 포함한다. 예를 들어, "Effective Java"의 항목 67 제목 : "과도한 동기화 피하기"(5 페이지 이상).

+2

스레드 안전성을 유지하기 위해 동기화가 반드시 필요한 것은 아닙니다. –

1

앞에서 설명한 것처럼 다중 스레드 환경에서 코드를 사용할 때 스레드 안전성이 필요합니다.

synchronize을 사용하지 않고 모든 작업을 수행하는 스레드 안전하지 않은 클래스를 제공하는 Collections 클래스의 접근 방식을 고려하고, 동기화되지 않은 클래스를 래핑하고 동일한 공용 메서드를 모두 제공하지만 기본 객체에서 동기화됩니다.

이렇게하면 클라이언트가 멀티 스레드 또는 단일 스레드 버전의 코드를 사용할 수 있습니다. 또한 별도의 클래스에서 모든 스레딩/잠금 논리를 분리하여 코딩을 단순화 할 수 있습니다.

관련 문제