2010-12-29 3 views
0

단일 스레드에서 액세스 할 수 있도록 설계된 정상적인 클래스가 있으므로 thread-safe 많은 스레드가 동시에 하나의 인스턴스를 사용할 수 있도록하려고합니다. 정적으로 만들고 locks을 사용하여 몇 가지 클래스 수준 메서드 및 변수가 있습니다. thread-safe. 또한 로컬 변수를 사용하는 메소드는 기본적으로 안전합니다 (각 스레드는 스택을 가짐).ThreadLocal을 사용하여 스레드 안전성을 보장하는 일반 클래스 <T>

내 질문은 이전 클래스의 properties 또는 더 일반적으로 non-static 변수입니다. ThreadLocal<T>을 사용하고 각 스레드는 properties이라는 고유 한 집합을 사용할 수 있습니까? 확실히 locksthread-safety 개의 문제가 setters (내 생각에는 getters이 안전하다고 가정)을 사용합니다.

그리고 ThreadLocal<T>의 실적이 우수한가요?

+1

이 클래스가 수행하는 작업과 여러 스레드의 간섭이있는 이유에 대해 설명하지 않으면 아무도 좋은 대답을 줄 수 없습니다. – Anon

+2

ThreadLocal이 정확히 무엇을한다고 생각합니까? 왜냐하면 나는 그것이 당신이 생각하는 것을하지 않는다고 생각하기 때문입니다. 스레드 로컬 저장소가 올바른 솔루션이라고 생각하는 이유를 설명 할 수 있습니까? –

+0

@ Eric : 스레드에 대한 변수를 로컬 변수로 읽습니다. 그래서 우리는 실행중인 스레드의 수만큼 속성을 가지고 있습니다. 따라서 객체는 스레드 당 상태를 가질 수 있습니다. – Xaqron

답변

1

실제로 스레드 로컬은 아닙니다. 각 스레드가 자체 데이터를 갖는 경우를위한 것입니다.

귀하의 경우, 필드 유형을 Map<Object, Object>으로 변경하고 Collections.synchronizedMap을 사용하여 스레드 안전성을 높이는 것이 좋습니다.

+0

또는 ConcurrenthashMap;) –

+0

누군가가 질문 태그 (편집 됨)에'Java'를 추가했습니다. 이것은'C# '클래스입니다. – Xaqron

2

게터는 생각만큼 안전하지 않습니다. Java 메모리 모델은 각 스레드에게 힙에 대한 자체 뷰를 제공하므로 변수에 대한 액세스를 동기화하지 않으면 스레드는 오래된 데이터를 읽을 수 있습니다. 변수 volatile을 만들면 부실 읽기를 방지하고 프리미티브에는 적합하지만 volatile은 원자 단위 액세스를하지 않습니다.

java.util.concurrent 패키지에 많은 도움이 될만한 수업이 있습니다. 스레드 안전 코드를 작성하는 것은 까다 롭습니다. 따라서 주제에 대해 좋은 책을 얻는 것이 좋습니다. Brian Goetz의 "Java Concurrency in Practice"는 꽤 좋습니다.

+0

thisPostUpvotes ++; – Rekin

+0

누군가가 질문 태그에 Java를 추가했습니다 (편집 됨). 이것은 C# 클래스입니다. – Xaqron

+0

Ah. 글쎄, 만약 당신이 자바에서 무엇이든하면 염두에두고 기억의 일을 곰. –