편집 : 실제 싱글 톤이 아니기 때문에 "싱글 톤"을 "단일 인스턴스"로 변경했습니다.클래스의 단일 인스턴스가 작업을 대기 중일 때 어떻게됩니까?
응용 프로그램에서 단일 인스턴스로 실행되는 DataAccess
클래스가 있다고 가정합니다. 이것은 MongoDB를 사용하지만 내부 비동기 호출이있는 모든 것에 적용 할 수 있습니다.
services.AddSingleton<DataAccess, DataAccess>();
을 그리고 그것은 컨트롤러에 주입 :
public class DataAccess
{
private IMongoDatabase _database;
public DataAccess(IMongoClient client)
{
_database = client.GetDatabase("myDataBase");
}
public virtual async Task<IEnumerable<User>> GetUsers()
{
var collection = _database.GetCollection<User>("users").Find("{}");
return await collection.ToListAsync();
}
}
DataAccess
DataAccess.GetUsers()를 호출하는 thread1이 있으며 ToListAsync 메서드의 결과를 기다리고 있다고 가정합니다. 이제 thread1이 대기하는 동안 thread2가 DataAccess.GetUsers()를 호출합니다. 무슨 일이야?
- DataAccess의 인스턴스가 thread1에 의해 잠겨있어서 thread1이 완료 될 때까지 thread2가 GetUsers 메서드 실행을 시작할 수 없습니까?
- DataAccess의 인스턴스를 사용할 수 있고 thread2는 동일한 컬렉션을 실행합니다. thread1이 실행 중일 때 메서드를 찾습니다.
- DataAccess의 인스턴스를 사용할 수 있지만 이미 실행중인 ToListAsync 메서드로 실행될 때 thread2가 절전 모드로 전환됩니까?
미안하지만, 싱글 톤은 어디에 있습니까? 코드에서 DataAccess 생성자를 원하는만큼 여러 번 호출 할 수 있습니다. – taquion
지금 업데이트하겠습니다. DataAccess는 컨트롤러가 호출하는 싱글 톤입니다. – Micteu
특정 유형이 문서에서 병렬로 여러 스레드에서 호출되도록 설계되어 있고 실행중인 경우 어떤 유형이 다중 스레드에서 호출되도록 설계되지 않았으며 동작 할 것이라고 가정 할 경우 예기치 않게 그리고 실수로 그렇게하면 – Servy