SingleCall 구성 요소보다 더 큰 잠재력은 없습니다. 안전하지 않은 방식으로 공유 메모리 위치에 액세스하려고하면 두 가지 모두 문제가 발생합니다.
에서는 SingleCall과 싱글의 차이
가에서는 SingleCall에 대한 모든 들어오는 요청이 그 통화를 처리하기 위해 만든 정의 형의 새로운 인스턴스를 얻을 것이다 것입니다. 각 인스턴스는 자체 메모리 공간과 인스턴스 변수를 갖지만 정적 변수와 전역 변수, 외부 리소스, 파일, 네트워크 연결 등을 여전히 공유 할 수 있습니다. SingleCall 클래스가 스레드가 안전하지 않은 방식으로 공유 메모리 상태에 액세스하도록 코딩 된 경우 그러면 문제가 발생할 것입니다.
싱글, 다른 한편으로는, 단지 그렇게 정의에 들어오는 모든 요청을 만들어 하나 개의 인스턴스를 가져, 그 싱글에서 사용중인 모든 인스턴스 변수는, 사실, 들어오는 모든 요청들 사이에서 공유됩니다. 좋은 예가 서버의 모든 코드가 하나 이상의 가입 된 클라이언트에게 메시지를 보내기 위해 액세스해야하는 메시지 게시자 일 수 있습니다 ....
@Cocowalla의 의견을 처리하려면이 작업을 재정의하십시오 방법
표시, 또는 아무도 잠시 동안 그것을 호출하지 않는 경우 귀하의 싱글이 예기치 않게 죽을 것 같은
MarshalByRefObject.InitializeLifetimeService()
...
public class MessageManager : MarshalByRefObject
{
#region Singleton/MarshalByRefObject code
private static MessageManager mgr =
new MessageManager(); // creates singleton
static MessageManager() { }
private MessageManager() { }
public static MessageManager Instance { get { return mgr; } }
public override object InitializeLifetimeService() { return (null); }
#endregion Singlelton code
// ... other stuff ...
}
// in Remoting Host initialization code...
MessageManager mgr = MessageManager.Instance; // generates singleton;
RemotingServices.Marshal(mgr, URI);
"내부 상태를 보호 할 수있는 잠금 장치 나 다른 조항이 없습니다"... 그게 싱글 톤이 맞습니까? 단일 스레드로 (초기) 구성을 제한하려면 자물쇠가 있어야한다는 것을 이해합니다. –