source

동기화되지 않은 정적 메서드가 정적 클래스 변수를 수정하지 않는 경우 스레드 안전합니까?

nicesource 2022. 10. 15. 08:35
반응형

동기화되지 않은 정적 메서드가 정적 클래스 변수를 수정하지 않는 경우 스레드 안전합니까?

동기화되지 않은 정적 메서드가 있는지 궁금한데, 정적 변수를 수정하지 않는 스레드 세이프입니까?메서드에 의해 로컬 변수가 생성되면 어떻게 됩니까?예를 들어, 다음 코드는 스레드 세이프입니까?

public static String[] makeStringArray( String a, String b ){
    return new String[]{ a, b };
}

그래서 제가 두 개의 스레드를 연속적으로 동시에 호출하는 방법, 하나는 개를 데리고 있고 다른 하나는 고양이와 개를 데리고 있는 방법(persian과 siamese)을 가지고 있다면 고양이와 개를 같은 배열에 둘 수 있을까요?아니면 고양이와 개가 동시에 같은 방법으로 호출하는 일은 없을까?

이 방법은 100% 스레드 세이프입니다.그렇지 않아도 마찬가지입니다.static스레드 안전성 문제는 스레드 간에 데이터를 공유할 필요가 있을 때 발생합니다.원자성, 가시성 등을 고려해야 합니다.

이 메서드는 스택에 상주하며 힙에 있는 불변 객체에 대한 참조인 파라미터에서만 작동합니다.스택은 본질적으로 스레드에 로컬이므로 데이터 공유는 전혀 이루어지지 않습니다.

불변의 객체(String이 경우)는 한번 생성되면 변경할 수 없고 모든 스레드의 값이 동일하기 때문에 스레드 안전합니다.한편, 그 방법이 수용(변동)하고 있는 경우는,Date문제가 생겼을 수도 있어요두 개의 스레드가 동일한 객체 인스턴스를 동시에 수정하여 레이스 조건과 가시성 문제를 일으킬 수 있습니다.

메서드는 일부 공유 상태를 변경하는 경우에만 스레드 비안전 상태가 될 수 있습니다.정적이든 아니든 상관없습니다.

기능은 완벽하게 스레드 세이프입니다.

생각해보면...만약 이것이 달랐다면 무슨 일이 일어났을지 추측해보세요.모든 일반 함수는 동기화되지 않으면 스레드 문제가 발생하므로 JDK의 모든 API 함수는 여러 스레드에 의해 호출될 수 있으므로 동기화해야 합니다.그리고 대부분의 경우 앱은 API를 사용하기 때문에 멀티스레드 앱은 사실상 불가능합니다.

이것은 생각할 수 없을 정도로 터무니없기 때문에, 당신만을 위해서입니다.문제가 생길 가능성이 있는 명확한 이유가 있다면 방법은 안전하지 않습니다.내 함수에 여러 개의 스레드가 있다면, 스텝 디버깅이 있고, 스텝 디버깅을 한 단계씩 진행하면 어떻게 될까 항상 생각해 보세요.두 번째 실이...아마 두번째는...문제가 있을까요?하나 찾으면 스레드 세이프가 아닙니다.

또한 Concurrent Hash Map과 같이 명시되어 있는 클래스를 제외하고 대부분의 Java 1.5 Collection 클래스는 스레드 세이프가 아닙니다.

이 문제를 자세히 알아보려면 volatile 키워드와 그 모든 부작용에 대해 자세히 살펴보십시오.semaphore() 및 Lock() 클래스와 java.util의 친구를 확인합니다.동시.클래스 주변의 모든 API 문서를 읽습니다.그것은 또한 배울 가치가 있고 만족스럽다.

너무 치밀한 답변이라 죄송합니다.

하다를 사용하세요.static동기화된 스태틱 방식을 사용하여 스레드 간에 공유되는 스태틱 데이터를 변경합니다.static키워드를 지정하면 작성된 모든 스레드가 단일 버전의 메서드로 경합격합니다.

하다를 사용하세요.volatile키워드와 동기화된 인스턴스 메서드는 각 스레드에 공유 데이터의 자체 복사본이 있으며 스레드 간에 읽기/쓰기가 유출되지 않음을 보증합니다.

위의 스레드 세이프 시나리오의 또 다른 이유는 문자열 객체가 불변하기 때문입니다.대신 가변 객체가 사용되는 경우(makeMutableArray 등).스레드 세이프티는 반드시 깨집니다.

완전한 메서드가 스택에 푸시되었기 때문에 발생하는 변수 작성은 스택 내에 존재하며(또한 예외는 정적 변수) 하나의 스레드에만 액세스할 수 있습니다.따라서 어떤 정적 변수의 상태를 변경할 때까지 모든 메서드는 스레드 세이프입니다.

다음 항목도 참조하십시오.

Java에서 static 메서드는 스레드 안전합니까?

언급URL : https://stackoverflow.com/questions/5173399/are-non-synchronised-static-methods-thread-safe-if-they-dont-modify-static-clas

반응형