2017-04-26 5 views
-1

편집 : 실제 싱글 톤이 아니기 때문에 "싱글 톤"을 "단일 인스턴스"로 변경했습니다.클래스의 단일 인스턴스가 작업을 대기 중일 때 어떻게됩니까?

응용 프로그램에서 단일 인스턴스로 실행되는 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

내 시작 클래스의 ConfigureServices 방법에서 "싱글"로 추가됩니다.

DataAccess.GetUsers()를 호출하는 thread1이 있으며 ToListAsync 메서드의 결과를 기다리고 있다고 가정합니다. 이제 thread1이 대기하는 동안 thread2가 DataAccess.GetUsers()를 호출합니다. 무슨 일이야?

  • DataAccess의 인스턴스가 thread1에 의해 잠겨있어서 thread1이 완료 될 때까지 thread2가 GetUsers 메서드 실행을 시작할 수 없습니까?
  • DataAccess의 인스턴스를 사용할 수 있고 thread2는 동일한 컬렉션을 실행합니다. thread1이 실행 중일 때 메서드를 찾습니다.
  • DataAccess의 인스턴스를 사용할 수 있지만 이미 실행중인 ToListAsync 메서드로 실행될 때 thread2가 절전 모드로 전환됩니까?
+5

미안하지만, 싱글 톤은 어디에 있습니까? 코드에서 DataAccess 생성자를 원하는만큼 여러 번 호출 할 수 있습니다. – taquion

+0

지금 업데이트하겠습니다. DataAccess는 컨트롤러가 호출하는 싱글 톤입니다. – Micteu

+0

특정 유형이 문서에서 병렬로 여러 스레드에서 호출되도록 설계되어 있고 실행중인 경우 어떤 유형이 다중 스레드에서 호출되도록 설계되지 않았으며 동작 할 것이라고 가정 할 경우 예기치 않게 그리고 실수로 그렇게하면 – Servy

답변

1

옵션 2 : singleton을 사용할 수 있고 thread2는 동일한 collection.Find 메서드를 실행하며 thread1도 실행 중입니다.

당신이 싱글 톤을 쓸 때 코드가 동시에 또는 안전하게 실행할 수 있는지 확인해야합니다. 보통 이것은 옵션 2에서 옵션 1로 전환하는 자원 주위에 lock을 넣어야합니다.

+0

내 말씨가 좀 어리 석다는 이유로 나를 바보로 만들려고하는 대신 내 호기심을 만족시켜 주셔서 감사합니다. – Micteu

관련 문제