2013-07-06 2 views
3

I found that declaring a variable as static makes no sense멀티 스레딩. 나는 이것이 every thread has its own stack 때문이라고 생각합니다. 이것이 유일한 이유입니까?멀티 스레딩의 정적 변수

나는 static variables should be used within synchronized block을 알고 있습니다. 하지만 왜?

+0

'의미가 없습니다'라는 것을 어떻게 알 수 있습니까? –

+0

나는 값이 각 스레드에서 공통적이지 않다는 것을 의미했다. – R9J

+0

_ 정적으로 변수를 선언하는 것이 멀티 스레딩에서 의미가 없음을 발견했습니다. [표창장은 필요 없습니다] – DaoWen

답변

11

정적은 멀티 스레딩에서 의미가 없습니다.

반박문입니다. 정적 변수는 여러 스레드간에 정보를 교환하는 데 사용할 수있는 공유 리소스입니다. 그리고 우리는 그러한 공유 자원에 액세스하는 동안 조심해야합니다. 따라서 다중 스레드 환경에서 정적 변수에 대한 액세스가 동기화되어 있는지 확인해야합니다.

모든 스레드는 자신의 스택

이 올바른 진술이있다. Each thread has its own stack but they share the process heap. 스택은 힙의 변수가 아닌 로컬 변수 만 보유합니다. 정적 변수는 힙의 PermGen 섹션에 저장되므로 액세스가 잘 보호되어야합니다.

+0

예 동기화 된 블록에서 사용하고 있지 않습니다. 왜 그래야만하지? – R9J

+0

그러면'static int a'가 힙이나 스택 메모리로 들어 갈까요? – ThreaT

+0

@Juned Ahsan, 어떻게 확인할 수 있습니까? "스레드가 프로세스 힙을 공유합니다." – shivam

3

질문의 첫 번째 부분에 이미 대답되어 있으므로 두 번째 질문에 대답하려고합니다.

정적 변수가 동기화 된 블록 내에서 사용되어야한다는 것을 알고 있습니다. 하지만 왜?

atomic을 사용하지 않으면 변수를 사용한 연산이 원 자성이 아니기 때문입니다. 그렇기 때문에 변수를 사용하여 작업하는 동안 변수를 차단해야합니다. 그러나 현실 세계에서는 휘발성 키워드를 사용할 수 있습니다.이 스레드는 실제 변수 값을 갖습니다.

2

다중 스레드 환경에서 변수를 변경하면 새 값이 캐시 될 수 있으므로 반드시 필요하지는 않습니다. 물론 정적 변수에도 마찬가지입니다. 동기화 된 블록을 사용하지 않는 경우 대신 volatile을 사용해보십시오. 또한 동기화 할 필요없이 다양한 스레드가 업데이트 된 복사본을 얻게됩니다. 웨더 volatile 네 가지 응용 프로그램이 귀하의 요구 사항에 따라 다릅니다.

1

정적 선언에 volatile을 추가하십시오.

volatile은 다른 스레드가 변수의 최신 값을 보게합니다. 휘발성으로 인해 말이 될 것입니다.

그러나 volatile은 원 자성을 보장하지 않습니다. 둘 이상의 스레드에서 변수에 쓰는 경우 원자 단위 또는 synchronize 블록을 사용할 수 있습니다.

나는 volatile이 괜찮을 것이라고 생각합니다.

관련 문제