Делает ли наличие нескольких экземпляров класса (ссылочного типа) безопасным для потоков? - PullRequest
0 голосов
/ 01 марта 2019

Надеюсь, вы поможете мне прояснить мое понимание безопасности потоков и нескольких экземпляров ссылочного типа.

Я изложил простой сценарий ниже.Мой вопрос: если ProcessorOne и ProcessorTwo работают одновременно, и если класс DatabaseIntegration является ссылочным типом, а ProcessorOne и ProcessorTwo оба имеют свои собственные экземпляры DataBaseIntegration, то существует вероятность того, что объект, сохраненный в ProcessorOne, будет иметь имяот ProcessorTwo помешал?

public class ProcessorOne
{
    private readonly DatabaseIntegration databaseIntegration;
    public ProcessorOne(DatabaseIntegration databaseIntegration)
    {
        this.databaseIntegration = databaseIntegration;
    }

    public void Process()
    {                                  
       this.databaseIntegration.SetName("NameOne")
       Entity entity = new Entity()
       this.dataBaseIntegration.Save(entity);
    }
}

public class ProcessorTwo
{
    private readonly DatabaseIntegration dataBaseIntegration;
    public ProcessorTwo(DatabaseIntegration dataBaseIntegration)
    {
        this.dataBaseIntegration = dataBaseIntegration;
    }

    public void Process()
    {            
       this.databaseIntegration.SetName("NameTwo")
       Entity entity = new Entity()
       this.dataBaseIntegration.Save(entity);
    }
}

public class DatabaseIntegration 
{
    private string entityName;

    public void SetName(string entityName)
    {
        this.entityName = entityName;
    }

    public void Save(Entity entity)
    {            
         entity.EntityName = this.entityName;
         using (DbContext context = new DbContext(sqlConnection))
         {
             context.Entity.Add(entity);
             context.SaveChanges();                 
         }
    }
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Ответ - да, они потокобезопасны.Но почему бы вам не задать имя сущности при ее создании.В этом случае, даже если вы используете один и тот же объект DatabaseIntegration, он все равно будет поточно-ориентированным, поскольку каждый раз при вызове Save () вы передаете разные объекты сущности.

public class ProcessorOne
{
   private readonly DatabaseIntegration databaseIntegration;
   public ProcessorOne(DatabaseIntegration databaseIntegration)
   {
       this.databaseIntegration = databaseIntegration;
   }

   public void Process()
   {                                  
      Entity entity = new Entity(){entityName = "NameOne"}
      this.dataBaseIntegration.Save(entity);
   }
 }

public class ProcessorTwo
{
   private readonly DatabaseIntegration dataBaseIntegration;
   public ProcessorTwo(DatabaseIntegration dataBaseIntegration)
   {
       this.dataBaseIntegration = dataBaseIntegration;
   }

   public void Process()
   {            
      Entity entity = new Entity(){entityName = "NameTwo"}
      this.dataBaseIntegration.Save(entity);
   }
}

public class DatabaseIntegration 
{
   public void Save(Entity entity)
   {            
     using (DbContext context = new DbContext(sqlConnection))
     {
         context.Entity.Add(entity);
         context.SaveChanges();                 
     }
   }
}
0 голосов
/ 01 марта 2019

Нет, они будут иметь разные имена, потому что, как вы сказали, в вашем коде каждый класс имеет экземпляр экземпляра DatabaseIntegration.

Таким образом, ProcessorOne будет иметь имя dataBaseIntegration как «NameOne», а ProcessorTwo будет иметьИмя dataBaseIntegration как "NameTwo".

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...