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

Надеюсь, вы поможете мне прояснить мое понимание безопасности потоков и вызовов методов в Singleton.

Ниже я обрисовал простой сценарий.У меня такой вопрос: если ProcessorOne и ProcessorTwo работают одновременно, и если класс DatabaseIntegration является ссылочным типом и является одноэлементным (управляемым CastleWindsor), а ProcessorOne и ProcessorTwo совместно используют этот одноэлементный экземпляр DataBaseIntegration, то есть потенциал дляОбъект, сохраненный ProcessorOne, чтобы иметь имя из ProcessorTwo?

Значение может ли параметр Entity, передаваемый в databaseIntegration.Save (Entity entity) посредством ProcessorOne, изменяться потоком, в котором выполняется ProcessorTwo, после того, как поток ProcessorOne выполняет вызов метода?

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

    public void Process()
    {                                  
       Entity entity = new Entity() 
       {
           Name="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() 
       {
           Name="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();                 
         }
    }
}

1 Ответ

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

Нет.

Хотя оба ProcessorOne и ProcessorTwo имеют одинаковую ссылку на DatabaseIntegration и могут одновременно запускать метод DatabaseIntegration.Save, метод DatabaseIntegration.Saveявляется поточно-ориентированным.

Безопасно построить два DbContexts, которые совместно используют одно и то же соединение, и использовать их одновременно - они не будут мешать друг другу.Ваша база данных позаботится о том, чтобы две вставки не мешали друг другу.

Если ваш метод DatabaseIntegration.Save сделал некоторые вещи, которые не были поточно-ориентированными, например, если у вас было поле на DatabaseIntegration, который был изменен с помощью Save вне блокировки, тогда вы можете ввести проблемы с безопасностью потоков.

...