programing

정적 메서드는 스레드 안전합니까?

minimums 2023. 7. 2. 19:11
반응형

정적 메서드는 스레드 안전합니까?

모든 웹 페이지에서 각 페이지를 작성하는 데 걸리는 시간을 계산하기 위해 호출되는 정적 타이머 클래스가 있습니다.

제 질문은 정적 클래스가 스레드 안전한가요?이 예에서 동시 사용자가 시작 시간과 종료 시간에 문제를 일으킬 수 있습니까?예를 들어 다른 스레드가 시작 및 중지 값을 덮어씁니다.

public static class Timer
{
    private static DateTime _startTime;
    private static DateTime _stopTime;    

    /// <summary>
    /// Gets the amount of time taken in milliseconds
    /// </summary>
    /// <returns></returns>
    public static decimal Duration()
    {
        TimeSpan duration =  _stopTime - _startTime;
        return duration.Milliseconds;
    }

    public static void Start()
    {
        _startTime = DateTime.Now;
    }

    public static void Stop()
    {
        _stopTime = DateTime.Now;
    }
}

이 수업은 정적이 아닌 수업이어야 합니까?

(이 강의는 asp.net 마스터 페이지에서 호출됩니다.)

정적 메소드는 본질적으로 스레드 세이프가 아닙니다.CLR에서는 인스턴스 방법과 다를 바 없이 처리됩니다.차이점은 일반적으로 스레드 세이프가 되도록 노력해야 한다는 것입니다. (스레드 세이프가 아닌 .NET BCL 정적 메서드는 생각할 수 없습니다.인스턴스 메소드는 일반적인 패턴이 개체를 만들고 하나의 스레드에서 반복적으로 사용하는 것이기 때문에 종종 스레드 안전하지 않습니다. 그리고 여러 스레드에서 개체를 사용해야 하는 경우 관련 조정에는 개체가 안전하게 사용되는지 확인하는 작업이 포함됩니다.대부분의 경우 개체 자체보다 조정 코드에서 수행하는 것이 더 적합합니다.(일반적으로 전체 작업 시퀀스를 효과적으로 원자적으로 만들고자 합니다. 개체 내에서는 수행할 수 없는 작업입니다.)

당신의.Timer클래스는 확실히 스레드 세이프가 아닙니다. 두 스레드는 서로의 데이터를 쉽게 짓밟을 수 있으며, 기간을 계산할 때 스레드가 "스레드" 데이터를 사용하는 것을 막을 수 있는 것은 없습니다.

대신 수업을 이용하세요. 그것이 바로 그것을 위한 목적입니다.물론 여러 스레드에서 하나의 인스턴스를 사용하려면 일반적인 단계를 수행하여 안전을 보장해야 하지만 일반적으로 훨씬 더 나은 위치에 있게 됩니다.물론Stopwatch완벽하지도 않습니다. 자세한 내용은 이 질문과 아래 댓글을 참조하십시오. 하지만 적어도 이 유형은 용도에 맞게 설계되었습니다. (누가 알겠어요, 언젠가는 고쳐질지도 모릅니다...)

여기서는 예제가 스레드 세이프가 아닌 메커니즘과 이유에 더 중점을 둔 좋은 논의가 있습니다.

요약하자면, 먼저 정적 변수가 공유됩니다.정적 메서드에 로컬인 경우에도 로컬 변수로 만들 수 있다면 자체 스택 프레임을 사용할 수 있으므로 스레드가 안전합니다.또한 정적 변수(예: 잠금 및/또는 이 스레드에서 다른 사용자가 언급한 기타 다중 스레드 프로그래밍 기술)를 보호하는 경우 샘플 정적 클래스를 스레드 안전하게 만들 수 있습니다.

둘째, 사용자가 수정하거나 다른 스레드에 의해 상태가 영향을 받을 수 있는 외부 변수 인스턴스를 사용하지 않기 때문에 예제도 스레드 안전합니다.

타이머 클래스는 스레드 세이프가 아닙니다.일반 클래스를 생성하고 시간을 측정해야 할 때마다 인스턴스화해야 합니다.

Timer timer = new Timer();

timer.Start();
//...
timer.Stop();

decimal duration = timer.Duration();

더 좋은 것은 다음과 같은 기능을 수행하는 내장 .NET 클래스가 있다는 것입니다.

Stopwatch sw = Stopwatch.StartNew();

sw.Stop();

TimeSpan duration = sw.Elapsed;

예, 맞습니다. 이 클래스의 정적 멤버/액세스자는 다른 사용자에 의해 덮어쓰게 됩니다.

이것이 인스턴스와 정적 구성원이 아닌 구성원이 있는 이유입니다.

언급URL : https://stackoverflow.com/questions/1090650/are-static-methods-thread-safe

반응형