C#同步对象 - 与写入访问器重复的代码

wei*_*mat 3 c# multithreading synchronization

我喜欢使用在更改属性时锁定的私有对象同步自身的对象.有没有通用的方法来实现这一目标?对于每个属性,我的代码看起来总是这样(带有一个更衣室对象)

private Object locker = new Object();
private int x; 
    public int X
    {
    get {return x;} 
    set{
        lock(locker){x=value;}
    }
Run Code Online (Sandbox Code Playgroud)

是否是实现线程安全修改属性的更简单方法.

Jon*_*eet 8

你的代码看起来应该不那样 - 你也应该锁定get.否则,由于复杂的内存模型原因,获取数据的线程可能无法获得最新值.

但不,我不知道有什么方法可以解决这个问题.你可以用lambda表达式和扩展方法做一些奇怪的事情,但它会过度使用IMO.

您还应该强烈考虑是否确实希望各个属性是线程安全的.这可能是正确的做法 - 但我发现通常我不需要大多数类型的线程安全.只有少数类型需要直接了解线程,然后他们在使用对象时取出适当的锁,而不是执行锁定的对象.它确实取决于你正在做什么.

对于某些情况下,另一种方法是使用一成不变的类型-这是不错的,当你可以做到这一点,但如果你需要一个线程看到另一个所做的更改,你需要一些类型的波动或同步的.