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

本文关键字:模式 什么 问题 锁定 对象 不安全 线程 | 更新日期: 2023-09-27 17:59:43

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

然而,就模式和最佳实践而言(尤其是我自己已经弄清楚了),我并不过分热衷于公开两个整理相同结果的集合。但是不安全的集合确实需要公开,我不想让它成为私有的,并且有一个"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>类的实例不是线程安全的,因此您的解决方案不稳定。

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


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