2010-04-28 7 views
3

클래스에 ArrayList binaryScanData이라는 클래스 변수가 있습니다. 그것에 접근 할 수있는 모든 메소드에서, 공유되기 때문에 lock(binaryScanData)을 붙인다. 이제이 메소드 중 하나를 다른 util 클래스로 옮겨서 static 메소드로 만들고 싶습니다. C# 메서드 매개 변수를 잠글 수 있습니까?

public static void convertAndSaveRawData(ref MemoryStream output, ref ArrayList binaryScanData)

우리의 질문에

는 다음과 같습니다 :

  • 어떻게 우리가 binaryScanData 있음을 을 sychoronize 수
      우리는이 같은 방법으로 그 binaryScanData을 통과 할 것인가? 원래대로 할 수 있을까요?
    1. ref? 그것은 convertAndSaveRawData 방법으로 읽혀질 것입니다.
  • +0

    구현 변경을 고려하십시오. void를 다시 전달하고 여러 ref 매개 변수를 사용하는 경우 응답 객체를 만드는 것을 고려해야합니다. – Tejs

    +3

    List 과 같이 ArrayList를 사용하는 이유는 무엇입니까? –

    답변

    4

    참조가 필요하지 않으며 참조 자체를 변경 (예 : 새 목록을 지정)하는 경우에만 필요합니다. 원한다면 여전히 개체를 잠글 수 있습니다. 나는 SyncRoot에 락킹 (lock)을 권한다. ArrayList가 있는지 확실하지 않다. 그렇지 않은 경우 List<T>까지 이동할 것을 고려해보십시오.

    +0

    메서드 매개 변수를 잠그면 전달 된 원본 객체도 잠 깁니 까? – 5YrsLaterDBA

    +0

    SyncRoot의 사용은 일부러 권장하지 않습니다 ... http://blogs.msdn.com/brada/archive/2003/09/28/50391.aspx – kervin

    4

    binaryScanData = something을 쓰지 않는 한 매개 변수를 ref으로 설정할 필요는 없습니다.

    다른 것과 마찬가지로 매개 변수를 잠글 수 있습니다.
    keyowrd는 개체 인스턴스에 대해 잠금을 설정합니다. 인스턴스의 출처는 중요하지 않습니다.

    +2

    잠글 필요가 없음을 기억하는 것이 중요하고 유용합니다 잠 그려는 객체. System.Object에서 오는 모든 것을 잠글 수 있습니다. 예를 들어, ListOfPeople을 사용할 수 있으며이를 사용하는 경우 PeopleLockObject와 같이 완전히 관련없는 객체를 잠글 수 있습니다. ListOfPeople에 액세스하려는 모든 시도가 PeopleLockObject에 대한 잠금을 수행하면 문제가되지 않습니다. 객체를 잠그면 객체에 아무런 영향을주지 않기 때문에 이것을 기억하는 것이 중요합니다. 즉, 객체를 잠그면 다른 스레드에서 객체에 액세스하여 두 위치에서 잠금을 사용하지 않으면 중단시킬 수 있습니다. – NibblyPig

    1
    1. 어떻게 그 binaryScanData를 동기화 할 수 있습니까? 원래대로 할 수 있을까요?

    동기화가 필요한 모든 코드 조각에서 동일한 개체 인스턴스를 잠그면.

    수정하는 것과 동일한 객체 을 반드시 잠그는 것은 아닙니다.. 사실 그것은 위험하며 나쁜 습관으로 간주됩니다. 다른 코드가 동일한 객체를 잠글 수 있기 때문에 교착 상태 및 기타 불쾌감을 받기 쉽습니다. 자신 만의 개인 객체를 만들고이를 동기화에 사용하는 것이 가장 좋습니다.

    1. ref가 필요합니까? 해당 convertAndSaveRawData 메서드에서만 읽습니다.

    아니요. 완전히 다른 두 가지 개념이 혼재되어 있습니다. 당신이 모든 호출을 동기화해야합니다 어디 그렇게 만 래퍼를 사용

    ArrayList unsyncList = new ArrayList(); 
    ArrayList syncWrapperList = ArrayList.Synchronized(unsyncList); 
    

    가 잠금에 반환 한 비용이 :

    0

    당신은/세트 얻을 내부 모두에 고정 기존의 ArrayList에 동기화 된 래퍼를 만들 수 있습니다 .

    2

    이것은 매우 잘못 들립니다. 클래스 객체가 하나의 ArrayList 인스턴스를 공유하고 있기 때문에 액세스하는 코드가 동기화되어야한다고 생각할 수 있습니다.그러나 그것은 ArrayList 객체 참조를 정적으로 만들 것입니다. 왜 이것을 인수로 전달해야합니까?

    다른 코드가 클래스 객체에 대한 참조를 사용하지 않고이 정적 메서드를 호출해야한다면 ArrayList의 자체 인스턴스를 전달해야 할 수 있습니다. 그러면 자물쇠를 채울 필요가 없어졌습니다. 호출 코드는 잠금을 처리해야합니다. 오직 특정 ArrayList 객체가 어떤 다른 장소에서 사용되는지 알 수 있습니다.

    죄송합니다. 나는 그것을 아주 잘 이해하지 못합니다. ArrayList 객체를 잠금 인자로 사용하여 시작합니다. 데이터를 잠글 수 없으며 데이터를 사용하는 코드 만 잠글 수 있습니다.

    0

    ref은 참조 유형이므로 두 매개 변수가 참조로 전달되므로 매개 변수로 필요하지 않습니다.

    지적했듯이 ArrayList은 복싱을해야하는 경우가 많으므로 항목 목록을 보관하는 방법으로 더 이상 권장되지 않으므로 일반적으로 훨씬 느립니다. 대신 List<T>을 시도해보십시오.

    두 가지 요점이 답을 얻지 못합니다. 목록을 동기화하려면 .NET 구현이 스레드로부터 안전하지 않으므로 목록을 동기화하는 것이 중요하지 않습니다. 이에 대한 전체적인 설명을 볼 수 있습니다 : Why is C# List<> not thread-safe? 자신의 클래스 내에서 목록을 동기화 할 수 있지만 해당 클래스 외부에서 여전히 변경 될 수 있습니다.

    목록을 직접 작성한 경우 read-only list으로 만들고 List<T> 또는 IList<T>의 서브 클래스로 추가하는 방법을 제공하는 한 가지 방법입니다.

    ThreadSafe List 문서는 일반적인 스레드 안전 목록을 만들려고 시도하지만 페이지 하단의 주석을 읽는다면 여전히 단점이 있습니다.

    관련 문제