【发布时间】:2021-06-24 16:59:37
【问题描述】:
我有一个类示例,其中GetEntity 和Reconfigure 方法可以由多个线程同时执行。
class Store
{
private int number;
private string name;
private Rules rules;
private Database database;
public Entity GetEntity(int id)
{
Console.WriteLine($"{number} {name}");
return database.Get(rules, id);
}
public void Reconfigure(Config config)
{
number = config.Number;
name = config.Name;
policy = new Rules { Timeout = config.Timeout };
database = DatabaseFactory.GetDatabase(config.DatabaseData);
}
}
class Rules { }
class Database { }
- 我真的需要将读取/分配操作同步到
number/name/rules/database字段吗? - 如果一个线程正在更新对象上的指针,而另一个线程同时读取指针,那么最后一个线程能否读取损坏的数据或面临其他问题?
【问题讨论】:
-
添加一个锁定对象以确保这一点。
-
如果
Reconfigure可以随时调用,那么可以,您需要使用一些同步原语。 -
@peter,如果我使用 Interlocked.Exchange(ref database,DatabaseFactory.GetDatabase(config.DatabaseData)),我会在 GetEntity 方法中进行读取操作并在重新配置线程安全中进行分配操作还是仅分配操作?
标签: c# concurrency synchronization