2011-10-06 5 views
2

따라서 this을 읽은 후에는 "잠금"메커니즘에 대해 혼란스러워하거나 요청에 대해 근본적으로 혼란 스럽습니다.정적 객체에 대한 잠금을 획득하면 다른 요청 스레드에서 차단해야합니까?

특정 클래스의 정적 변수는 모든 요청에 ​​액세스 할 수 있습니까 (하나의 서버라고 가정)? 내가 이해하는 것으로부터, 그들은 그렇지 않습니다.

정적 및 const 변수에 여러 요청에서 액세스 할 수 없다는 가정하에 "lock"이 해당 객체와 관련된 배타적 잠금을 얻기 때문에 다른 요청을 차단해서는 안됩니다 (someLockObject). 그리고 다시, 그 객체 (즉, someLockObject)는 내 가정 하에서 모든 요청에 ​​대해 다릅니다.

This 답변과 몇 가지 다른 점은 내가 뭔가 잘못되었다는 것을 의미합니다. 그리고 "잠금"이 중요한 섹션 만 차단하면 "잠금"코드 블록에서 동일한 코드를 실행하는 모든 스레드가 객체를 차단해야하는 이유는 무엇입니까? 나는 나 자신을별로 이해하지 못할 수도있다.

답변

4

귀하의 혼란이 원래 가정에서 발생 :

지정된 클래스의 정적 변수는 (하나 개의 서버를 가정) 모든 요청에 ​​액세스 할 수 있습니까? 내가 이해하는 것으로부터, 그들은 그렇지 않습니다.

특정 클래스의 정적 필드는 전체 응용 프로그램 도메인의 모든 스레드에서 모든 인스턴스에서 동일합니다. 실용적으로, 한 서버 인스턴스에서 이는 기본적으로 static 필드가 모든 요청에서 공유됨을 의미합니다.

상수 값은 더욱 전역 적입니다. const 값을 참조하면 실제로 컴파일 된 코드에서 리터럴 상수가 생성됩니다. 예를 들어

public class Numbers { public const int Three = 3; } 
2
Are static variables of a given class accessible to all requests (

한 가정이 같은 특정 클래스 ...

Console.WriteLine(Numbers.Three); 

:

Console.WriteLine(3); 

... 정확하게 동일한 코드를 생성 서버)? 내가 이해하는 것으로부터, 그들은 그렇지 않습니다.

예, 모든 요청에 ​​액세스 할 수 있으며 정적 변수를 선언하면 매우 불쾌한 버그/일관되지 않은 동작을 얻을 수 있습니다.

클래스에서 정적 메서드를 사용할 수 있지만 내 생각에는 정적 및 로컬 스레드가 아닌 메서드 내에서 변수를 선언해야한다는 것입니다.

그리고 정적/const를 변수가 있다는 가정하에

하지 여러 요청에 액세스 , 우리는 "잠금"그 객체와 관련된 독점 잠금을 획득 있기 때문에 다른 요청을 차단해서는 안 (someLockObject)를 잠글 때. 그리고 다시, 그 대상 (즉. someLockObject는) 내 가정하에 모든 요청에 ​​대해 다른 초기 가정이 잘못이기 때문에, 위의 진술은 당신이) (someObjectLock을 잠글 경우 현재 스레드 잡고 고정 될 때까지 다른 스레드를 차단하는 것 또한 의미에서 잘못

그것을 풀어 라.

관련 문제