ThreadLocal property

本文关键字:property ThreadLocal | 更新日期: 2023-09-27 17:54:00

如果我们有一个ThreadLocal属性(每个线程都有它唯一的属性),那么哪个是正确的(我们不想使用自动setter/getter):

A)

private ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>();
public ThreadLocal<MyClass> SomeProperty
{
    get
    {
        return _someProperty.Value;
    }
    set
    {
        _someProperty.Value = value;
    }
}

B)

private ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>();
public MyClass SomeProperty
{
    get
    {
        return _someProperty.Value;
    }
    set
    {
        _someProperty.Value = value;
    }
}

ThreadLocal property

我假设你想封装 ThreadLocal<T>,这样调用者只需要知道MyClass;在这种情况下,您仍然需要显式访问.Value,因为这是每个线程魔术发生的地方:

private readonly ThreadLocal<MyClass> _someProperty = new ThreadLocal<MyClass>();
public MyClass SomeProperty
{
    get { return _someProperty.Value; }
    set { _someProperty.Value = value; }
}

您应该使用第二种形式,以确保您控制何时设置该值。

如果你直接暴露ThreadLocal,你的调用者可以写SomeProperty.Value = null,你将无法阻止它。

通过强制所有访问通过你的类,你可以在setter中添加验证。

另外,第一种形式允许一个线程通过替换整个ThreadLocal实例来擦除其他线程上的属性值。

注意你的代码将无法编译;您需要返回并设置.Value