[英]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.