gpt4 book ai didi

c# - 线程不安全对象中的这种锁定模式有什么问题吗?

转载 作者:行者123 更新时间:2023-11-30 22:20:33 25 4
gpt4 key购买 nike

在这种线程不安全的环境中,这种模式似乎对我来说很有效,可以实现线程锁定。

然而,就模式和最佳实践而言(尤其是我自己发现的),我并不太热衷于公开整理相同结果的两个集合。但是不安全的集合确实需要公开,我不想将其设为私有(private)并使用“AddResult(x)”方法。

这是解决这个问题的正确方法吗?

public class UnsafeObject
{
public ObservableCollection<HighSpeedObject> ResultsUnsafe { get; set; }

/// Accessed by UI thread once every 100ms
public List<HighSpeedObject> Results
{
get
{
lock (_padlock)
{
return ResultsUnsafe.ToList();
}
}
}

private readonly static object _padlock = new object();
}

最佳答案

ObservableCollectionz<T> class 的实例不是线程安全的,因此您的解决方案不稳定。

Results 中的锁属性只确保一个线程一次可以使用该属性,但它不保护 ResultsUnsafe属性(property)。其他线程可以更改 ResultsUnsafe 中的集合属性(property)而Results属性正在从中创建一个列表。


旁注:您正在使用静态成员作为非静态数据锁的标识符。这意味着该锁将阻止对该类的所有实例的访问,而不仅仅是您要保护的数据所在的实例。为了保护静态数据,您应该使用静态成员作为标识符,为了保护实例数据,您应该使用实例成员作为标识符。

关于c# - 线程不安全对象中的这种锁定模式有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14926537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com