2014-09-25 2 views
0

나는이 같은 단일 요청에 서로 다른 쓰레드에 세션에서 객체를 읽기/쓰기 해요 :in-proc 세션의 읽기/쓰기 객체가 원자 연산입니까?

이제
public class HomeController : Controller 
{ 
    public int Index() 
    { 
     Task.WaitAll(DoStuff(), DoMoreStuff()); 
     var foo = Session["foo"] as Foo; 
     return foo.MyProperty; 
    } 

    public Task DoStuff() 
    { 
     return Task.Factory.StartNew(() => 
     { 
      var foo = Session["foo"] as Foo; 
      if (foo == null || foo.MyProperty == 1) 
       foo = new Foo { MyProperty = 1 }; 
      Session["foo"] = foo; 
     }); 
    } 

    public Task DoMoreStuff() 
    { 
     return Task.Factory.StartNew(() => 
     { 
      var foo = Session["foo"] as Foo; 
      if (foo == null || foo.MyProperty == 1) 
       foo = new Foo { MyProperty = 2 }; 
      Session["foo"] = foo; 
     }); 
    } 
} 

public class Foo 
{ 
    public int MyProperty { get; set; } 
} 

이 코드의 논리가 분명히 이해가되지 않습니다하지만 난 어떤 종류의 보여를 제공하고 있습니다 작업은 내가하고 있어요 :

  • 객체 참조를 읽고,
  • 쓰기 객체 참조,
  • 새로운 객체를 생성,
  • OBJ를 읽고 ect 필드.

저는 기존 개체를 수정하고 있지 않습니다. 이 코드가 일반적으로 세션 상태 또는 메모리를 손상시킬 수 있습니까?

기본 in-proc 세션 구현이있는 ASP.NET MVC 응용 프로그램입니다.

이 코드가 세션에 액세스 할 때마다 Session.SyncRoot에 잠겨 있으면이 코드가 세션 상태를 손상시킬 수 있습니까?

답변

1

참조를 읽고 쓰는 것은 원하지만,이 경우에는 HttpSessionState 클래스가 스레드로부터 안전하지 않으므로 문제가됩니다.

한 스레드가 항목을 세션 상태로 설정하고 다른 스레드가 항목을 동시에 가져 오거나 설정하면 HttpSessionState 인스턴스가 손상 될 수 있습니다. 이렇게하면 비정상적으로 작동하거나 충돌을 일으킬 수 있습니다.

다른 스레드에서 세션 상태를 처리하려면 모든 액세스가 SyncRoot 속성 (또는 사용자가 선호하는 개체)을 사용하여 잠겨있는 코드 블록에 있어야합니다. 이러한 유형의 구성원이 스레드로부터 안전

"모든 공용 static (Visual Basic의 경우 Shared) 모든 인스턴스 멤버가 보장되지 않습니다


HttpSessionState class에 대한 문서는이 표준 선언이 포함되어 있습니다. 스레드 안전. "

정적 멤버는 특히 스레드 안전성을 손상시키는 작업을 수행하지 않으므로 스레드 안전성을 가지며 인스턴스 멤버는 스레드 안전성을 보장하기 위해 아무 것도하지 않습니다. 그것은 단순히 스레드로부터 안전하도록 설계되지 않았습니다.

관련 문제