繁体   English   中英

我可以在C#中的某一行锁定(某物)吗?

[英]Can I lock(something) on one line in C#?

下面的_otherThing字段是否会被锁保护?

class ThreadSafeThing
{
    private readonly object _sync = new object();

    private SomeOtherThing _otherThing;

    public SomeOtherThing OtherThing { get { lock(_sync) return _otherThing; } }

    public void UpdateOtherThing(SomeOtherThing otherThing)
    {
        lock(_sync) _otherThing = otherThing;
    }
}

是。

这与锁无关。 C#程序使用语句表示。 使用{}将多个语句组合为一个块。 可以在允许单个语句的上下文中使用块。 请参阅C#语言规范第1.5节。

这种结构:

lock(_sync) _otherThing = otherThing;

......与此结构相同:

lock(_sync)
{
    _otherThing = otherThing;
}

所以是的, _otherThing的赋值受到锁的保护。

是的,它将受到保护,因为_sync对象不会更改。

编辑:你在这里使用的锁几乎肯定不是你的意思,详见本篇文章的其他几个答案。

我所知道的

lock(_sync)
  _otherThing = otherThing;

是相同的

lock(_sync) _otherThing = otherThing;

是相同的

lock(_sync)
{
  _otherThing = otherThing;
}

这是类似的

if(something)
  _otherThing = otherThing;

这是一样的

if(something)
{
  _otherThing = otherThing;
}

(并且通过类似我的意思是在语法上类似,而不是在函数中。 if当然与lock不一样:p)

实际上即使没有lock ,也可以使用{ }if或类似于组语句。

您的代码不是线程安全的,因为您处理引用。

除非您的锁唯一阻止的是返回对象的引用(没有锁的线程安全,请参阅C#语言规范的第5.5节),那么您将不会对_otherThing线程安全进行更改。

在这种情况下,您需要使mutator和访问器线程安全(通过锁定对象的更改和读取)。

那可行。 单个语句和块语句在C#语法中几乎总是可以互换的(除了方法体等)。

但是,根本不需要进行锁定。 如果要在进行其他更改时阻止更改属性,则为yes。 如果SomeOtherThing是值类型( struct ),您还需要锁定它。

如果您选择不使用锁定,则需要声明字段volatile ,以确保您的更改在其他线程中立即可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM