0

내 코드는 AJAX UI (다중 스레드)에 의해 호출되고 포스트 데이터 처리는 Json에서 출력을 보냅니다. 최근에 코드를 리팩토링하는 동안 우리는 공통적이고 반복적 인 메서드를 별도의 파일로 옮겼습니다. 여기서는 정적/공유 데이터로 작업하지 않으므로 정적으로 만들었습니다. Parallel.foreach 또는 기타 멀티 스레드 시나리오에서 호출 할 때다중 스레드를 통한 정적 메서드 호출 - 서로의 입력 매개 변수를 간섭 할 수 있습니까?

public class Helper 
{ 
    public static C Method1(List<A> aList, List<B> bList) 
    { 
     C objC = new C(); 

     // Create ObjC based on inputs aList and bList 

     return objC; 
    } 
} 

하는 지금, 나의 이해는 다음과 같은 호출은 아무 문제가없는 것입니다, 확인하시기 바랍니다 : 다음 샘플 디자인 우리의 정적 방법이다. 우리는 역시 가지고 그러나

C resultC = Helper.Method1(aList, bList); 

는 (수있다 두 스레드가 상기 한 호출 및 aList, bList의 하나 개의 스레드 데이터가 다른 스레드에 의해 대체 할 수 하였기에, 따라서 결함이 결과를주는있을 수 예외), 그 문제에 대해 디버깅과 반복이 불가능합니다. 두 스레드가 실행되는 정확한 milli 초 내에 함께 실행/실행해야하기 때문에

여러분의 의견을 공유하기를 바랍니다. 위에서 언급 한 디자인이나 우리가 볼 수없는 구덩이가 있습니다. 우리는 쉽게 인스턴스 메소드로 대체 할 수 있습니다. 각 스레드는 작업 할 고유 한 인스턴스가 있기 때문에이 시나리오에서는 스레드 안전성이 확실합니다.하지만 필요하지 않을 수도 있고 인스턴스 생성을 유지하는 것이 번거롭다는 생각이들 때 편리하게 작업 할 수 있습니다. 정적 호출.

지금까지 코드 실행과 관련된 문제는 보지 못했지만, 만약 이런 일이 발생하면 두 개의 스레드가 동시에 올 수 있고 다른 스레드가 입력 매개 변수를 대체하는 경우 스레드가 여전히 처리 결과입니다.

+0

모든 호출에는 고유 한 스레드가 있습니다. –

+0

메소드를 호출하면 차이가 발생하지 않습니다. 사용 방법 * 수 *, 결과 변수를 정적 변수로 사용하면 발생할 수 있습니다. – Sayse

+4

* 매개 변수 *는 여러 스레드에서 문제가되지 않습니다. * 매개 변수에 전달하는 값은 * 일 수 있지만, 사용자가 예제에서 알 수있는 방법은 없습니다. 즉, 동일한 목록 객체를 다른 스레드에서 두 개의 메소드 호출에 전달하면 문제가 발생하지만 매개 변수 자체는 문제가되지 않습니다. –

답변

4

다른 모든 스레드에서 다른 List 인스턴스를 전달하면 질문에 대한 간단한 대답은 아니요입니다. .NET은 스레드 스레딩을 훌륭하게 처리합니다. 자체적으로 엉켜 들어가는 것은 아닙니다. 코드가 그렇게하도록 권장하는 경우에만 복잡해질 수 있습니다.

일들이 뒤섞이는 방법은 상태를 다른 스레드에 공유하는 것입니다. 예를 들어 그래서, 정적 메소드를 가진 당신은 어딘가에 정적 변수를 사용하는 것이 좋습니다를 생각할 수 있습니다 :

private static int count; 

public static void MyMethod() { 
    count = count + 1; 
    if(count == 5) { 
     console.log("Equal to 5"); 
    } 
}; 

count은 두 개의 다른 스레드에 의해 수정 될 수 있기 때문에 방법 이런 종류의 하지 스레드 안전 동시. 실제로 count이 5로 증가 될 수 있고 다른 스레드가 if 검사 전에 6으로 증가 할 수 있으므로 아무 것도 기록하지 않습니다. 이는 분명히 약간 혼란스러운 일입니다.

당신이 상태를 공유 할 수있는 다른 방법은 당신이 무언가를 전달하는 것입니다. 그러므로 대답의 시작 부분에서주의해야합니다. 동일한 객체를 여러 스레드에서 메서드로 전달하면이 객체는 이상적으로 immutable이어야하므로 수정할 수없는 컬렉션입니다. 이렇게하면 다른 스레드에 영향을 줄 수있는 개체 수정 메서드의 내부를 막을 수 있습니다. 이미 언급했듯이, 다른 스레드 내에서 동일한 인스턴스를 전달하는 경우에만 이것은 문제가됩니다.

+0

상세한 답변을 주셔서 감사합니다. 의심 스럽습니다. 다른 객체가 만들어져 정적 메서드에 전달된다는 요점을 돌 봅니다. 정적 메서드 내에서 정적 데이터 형식을 수정하지 않습니다. –

0

메서드 호출은 다른 스레드의 다른 메서드 호출을 방해하지 않습니다. 정적 변수에 대해서만 신중하게 생각해야합니다. 또한 스레드간에 입력 매개 변수 aList 또는 bList를 공유하면 문제가 발생할 수 있습니다.

관련 문제