IT박스

Java의 다중 스레드 환경에서 정적 메소드 동작

itboxs 2020. 7. 30. 10:12
반응형

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 키워드는 이러한 필수 동기화를 구현하는 가장 일반적인 방법입니다. 이 방법이 정적 이라는 사실 은 그러한 동기화가 결코 필요하지 않다는 것을 의미하지는 않습니다. 그냥 덜 동일한 개체를 (공유 액세스하는 스레드에 대해 걱정할 필요가 없기 때문에 ).

참고 URL : https://stackoverflow.com/questions/17343157/static-method-behavior-in-multi-threaded-environment-in-java

반응형