我有多个线程必须访问静态对象。主线程保存此静态对象,数据库线程处理包含有关此对象的信息的数据表上的更改。 每次数据库表发生更改时,我都会等待互斥锁并更改数据库线程中的基础属性。 现在我在主线程中实现了一个静态方法,它获取了对象的深层副本,因此其他线程无法更改此对象的属性。静态方法不会创建新对象并从当前对象复制属性信息。 因此每次另一个线程需要访问此对象时,都会创建另一个新对象。 我的问题是,这是不是一种不好的做法,因为在gc到来之前记忆总是在上升? 有更好的方法吗?
答案 0 :(得分:1)
除了内存缺陷之外,新对象在其生命周期内可能不是最新的(除非您保留对所有这些对象的引用并在您的DB线程中更新所有这些对象)。
如果我理解,你想拥有一个可以由一个独特的客户端(你的数据库线程)修改的对象,但对其他actor仍然是只读的。您可以使用只读接口作为对象的契约,并使其他线程只通过它接口访问该对象
public interface IObject
{
string Field1 { get; }
string Field3 { get; }
string Field2 { get; }
}
class RealObject : IObject
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
class DBClass
{
private RealObject _object;
public IObject GetObject()
{
return _object;
}
...
}
我希望这会对你有所帮助。