Java의 다중 스레드 환경에서 정적 메소드 동작
나를 귀찮게하고 내 마음에 몇 가지 주장을하는 간단한 바보 같은 질문이 있습니다. 아래 질문에 대한 모든 의심을 버리고 싶습니다.
class Clstest{
public static String testStaticMethod(String inFileStr) {
// section 0
// section 1
// do something with inFileStr
// section 2
// section 3
return inFileStr;
}
}
5 개의 스레드가 Clstest.testStaticMethod("arg-n")
동시에 호출을 실행한다고 가정 해 봅시다 .
스레드 1이 호출합니다 Clstest.testStaticMethod("arg-1")
.
스레드 1이 섹션 1에 있으면 스레드 2가를 호출합니다 Clstest.testStaticMethod("arg-2")
.
그러면 스레드 1은 어떻게됩니까? 수면 상태가 되나요?
스레드 1이 기회를 얻었을 때 일시 중지 된 섹션 1에서 실행을 다시 시작합니까?
하나의 Clstest.testStaticMethod
동일한 Clstest.testStaticMethod
스레드가 5 개의 스레드간에 공유 될 때 어떻게됩니까 ?
inFileStr
여러 스레드 에서 보낸 것을 교환 할 가능성이 있습니까?
Hans Passant의 답변이 좋습니다. 그러나 나는 이것을 만나고 Java를 처음 접하는 사람에게는 약간 더 간단한 수준으로 설명하고 설명하려고 생각했습니다. 간다 ..
Java의 메모리는 힙과 스택의 두 가지 종류로 나뉩니다. 힙은 모든 객체가 살고 스택은 스레드가 작업을 수행하는 위치입니다. 각 스레드에는 자체 스택이 있으며 서로 다른 스택에 액세스 할 수 없습니다. 각 스레드에는 현재 실행중인 코드 비트를 가리키는 코드에 대한 포인터가 있습니다.
스레드가 새 메소드를 실행하기 시작하면 해당 메소드의 인수 및 로컬 변수를 자체 스택에 저장합니다. 이러한 값 중 일부는 힙의 오브젝트에 대한 포인터 일 수 있습니다. 두 개의 스레드가 동시에 동일한 메소드를 실행하는 경우 둘 다 해당 메소드를 가리키는 코드 포인터를 가지며 스택에 자체 인수 및 로컬 변수 사본이 있습니다. 스택의 물건이 힙의 동일한 객체를 가리키는 경우에만 서로 간섭합니다. 이 경우 모든 종류의 일이 발생할 수 있습니다. 그러나 Hans가 지적했듯이 문자열은 변경할 수 없으므로 변경할 수 없으므로 이것이 "공유"되는 유일한 객체이면 안전합니다.
많은 스레드가 동일한 방법을 실행할 수 있습니다. JVM이 동시에 실행되지 않을 수 있습니다. JVM이 하드웨어 스레드에 예약 된 OS 스레드에 Java 스레드를 맵핑 할 때 시스템에있는 코어 수에 따라 다릅니다. 따라서 복잡한 동기화 메커니즘 을 사용하지 않고 이러한 스레드가 인터리브되는 방식을 거의 제어 할 수 없습니다 .
수면은 실이 스스로하는 일입니다.
수면 상태가 되나요?
아니요, 스레드를 실행해도 의도적으로 서로 동기화되지 않는 한 다른 스레드에는 영향을 미치지 않습니다. 프로세서 코어가 두 개 이상인 경우 모든 최신 컴퓨터에 해당 스레드가 동시에 실행될 수 있습니다. 머신에 충분한 코어가 없기 때문에 5 개의 스레드를 시작할 때 비트가 줄어 듭니다. 운영 체제는 이들 중 하나를 선택하여 실행할 수있는 시간을줍니다. 스레드 스케줄러의 작업 그러면 스레드가 "절전"상태가되지 않고 일시 중지되고 스레드 스케줄러가 실행될 기회를주기를 기다리는 것입니다. 스케줄러가 중단 한 위치에서 재개됩니다.
여러 스레드에서 보낸 inFileStr을 교환 할 가능성이 있습니까?
스레드에는 자체 스택이 있으므로 메소드 인수 및 로컬 변수는 각 스레드마다 고유 할 가능성이 없습니다. 또한 문자열을 사용하면 문자열 을 변경할 수 없으므로 이러한 스레드가 서로 간섭 할 수 없습니다.
인수가 다른 종류의 변경 가능한 객체에 대한 참조라면 그러한 보장은 없습니다. 또는 메소드 자체가 정적 변수 또는 힙의 오브젝트에 대한 참조를 사용하는 경우. 스레드가 오브젝트를 수정하고 다른 스레드가이를 읽을 때 동기화가 필요합니다. C # 언어 의 lock 키워드는 이러한 필수 동기화를 구현하는 가장 일반적인 방법입니다. 이 방법이 정적 이라는 사실 은 그러한 동기화가 결코 필요하지 않다는 것을 의미하지는 않습니다. 그냥 덜 동일한 개체를 (공유 액세스하는 스레드에 대해 걱정할 필요가 없기 때문에 이 ).
'IT박스' 카테고리의 다른 글
자바 스크립트로 텍스트 선택 지우기 (0) | 2020.07.30 |
---|---|
리터럴 키로 PHP 접두사 연관 배열? (0) | 2020.07.30 |
부트 스트랩 테이블 줄무늬 : 줄무늬 배경색을 어떻게 변경합니까? (0) | 2020.07.30 |
MSMQ 샘플 응용 프로그램을 작성하는 데 필요한 최소한 (0) | 2020.07.29 |
Visual Studio Code에서 git history를 어떻게 볼 수 있습니까? (0) | 2020.07.29 |