我喜欢使用在更改属性时锁定的私有对象同步自身的对象.有没有通用的方法来实现这一目标?对于每个属性,我的代码看起来总是这样(带有一个更衣室对象)
private Object locker = new Object(); private int x; public int X { get {return x;} set{ lock(locker){x=value;} }
是否是实现线程安全修改属性的更简单方法.
你的代码看起来应该不那样 - 你也应该锁定get.否则,由于复杂的内存模型原因,获取数据的线程可能无法获得最新值.
但不,我不知道有什么方法可以解决这个问题.你可以用lambda表达式和扩展方法做一些奇怪的事情,但它会过度使用IMO.
您还应该强烈考虑是否确实希望各个属性是线程安全的.这可能是正确的做法 - 但我发现通常我不需要大多数类型的线程安全.只有少数类型需要直接了解线程,然后他们在使用对象时取出适当的锁,而不是执行锁定的对象.它确实取决于你正在做什么.
对于某些情况下,另一种方法是使用一成不变的类型-这是不错的,当你可以做到这一点,但如果你需要一个线程看到另一个所做的更改,你需要一些类型的波动或同步的.