2011-03-31 3 views
4

스레드 안전하지 않은 많은 클래스가 Java에 추가되는 것을보고 있습니다.스레드 안전하지 않은 java 클래스가 추가 된 이유는 무엇입니까?

Like StringBuilder는 스레드 안전이고 StringBuilder는 Stringbuffer보다 권장합니다.

또한 다양한 컬렉션 클래스는 스레드로부터 안전하지 않습니다.

스레드 안전하지 않은 것이 좋습니다.

아니면 그냥 바보이며 아직 스레드 안전성의 의미를 이해하지 못합니까?

답변

11

스레드 안전성 때문에 작업 속도가 느려지고 모든 것이 멀티 스레드 여야하는 것은 아닙니다.

http://en.wikipedia.org/wiki/Thread_safety

스레드/여부를 충분히 당신이 편안하고,이 책을 읽고 생각, 그것은이 좋은 리뷰 :

스레드 안전에 관한 기본 사항을 알아 보려면이 문서를 읽어보십시오 http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601

+0

그럼 멀티 스레딩에 StringBuilder를 사용하고 싶습니다. ?? –

+1

@Lokesh Sah : 그런 다음 syncrhonized 블록에서'StringBuilder'를 사용하거나'StringBuffer'를 사용하십시오. –

+0

@Lokesh Sah : 멀티 스레드 프로그램의 한 스레드에서'StringBuilder'를 사용할 때 아무런 문제가 없습니다. 여러 스레드에서 문자열을 추가하려면 원하는 의미를 원하십니까? 하나의 쓰레드가 다른 쓰레드들 사이에 아무 것도없이 여러 문자열을 추가하기 위해 얼마 동안'StringBuilder'를 소유하게할까요? 또는 추가 된 문자열을 임의로 인터리브하려는 경우 후자의 경우에는'StringBuffer'를 사용하십시오. – jmg

2

본래 스레드 안전 코드의 성능 오버 헤드가 있습니다. 동시 컨텍스트에서 클래스를 필요로하지 않지만 성능이 높아야 할 경우 원본 클래스는 이상적이지 않습니다.

+0

이 스레드 안전 개념을 자세히 설명 할 수 있습니까? –

+0

@Lokesh Sah : 상태 (이 경우 변경 가능한 문자열)가 있고 여러 스레드가 작동하는 경우 상태가 손상 될 수 있습니다. 예 : 문자열이 '실행'이면 스레드 A는 '닝'을 추가하여 '실행 중'으로 변경하고 스레드 B는 '두 번째 문자를'u '에서'a '로 변경하여 스레드를'실행 '으로 변경할 수 있습니다. 두 스레드가 동시에이 변경을 시도하면 손상된 상태가 될 수 있습니다. 이 경우에는 'ranning'입니다. 이를 방지하기 위해 각 스레드는 변경 가능한 문자열을 잠그고 현재 값을보고 변경 작업을 수행하고 잠금을 해제해야합니다. –

3

스레드 안전성은 전부 또는 일부 속성이 아닙니다. 10 년 전 일부 책에서는 클래스의 모든 메소드를 스레드로 안전하게하기 위해 동기화 된 것으로 표시하는 것이 좋습니다. 이것은 약간의 비용이 들지만 전체 프로그램이 스레드로부터 안전하다는 보장과는 거리가 있습니다. 따라서, 당신은 의문의 여지가있는 비용을 가지고 있습니다. 즉, Java 라이브러리에 추가 된 클래스가 스레드 안전하지 않은 이유가 여기에 있습니다.

"모든 방법을 동기화하십시오"전략은 한 개체의 일관성에 대한 보증 만 제공 할 수 있으며 데드락을 도입하거나 생각보다 약할 가능성이 있습니다 (wait()에 대해 생각하십시오).

return new StringBuilder().append("this").append("that").toString()

모두 하나 개의 스레드에서, 필요 아무것도 동기화 없음 :

2

의 StringBuilder의 전형적인 사용은 같은입니다.

+0

여러 스레드에서 StringBuffer를 사용한다면'thisthisthatthat' 또는'thisthatthisthat' 등을 얻을 수 있습니다. –

+0

True이지만, 여러 스레드에서 StringBuilder를 사용하면 상황이 훨씬 심각해질 수 있습니다. append() 메서드를 살펴보고 두 스레드가 동시에 StringBuilder 상태를 수정할 때 어떤 일이 일어날 지 생각해보십시오 –

+0

어느 쪽이든 나쁜 디자인은 StringBu * er 스레드를 공유하므로 텍스트가 손상됩니다. 하지만 StringBuilder는 더 나빠질 것입니다. ;) –

4

일부 클래스는 여러 스레드에서 사용하기에 적합하지 않습니다. StringBuffer는 IMHO 중 하나입니다.

StringBuffer를 다른 방법으로 구현하는 것이 더 간단 할 수는없는 멀티 스레드 방식으로 고안 한 경우조차도 매우 어렵습니다.

관련 문제