C# C锁定、属性和权限

C# C锁定、属性和权限,c#,properties,locking,modifiers,C#,Properties,Locking,Modifiers,当需要多线程访问时,我一直在使用锁定值类型属性。此外,我一直想更加勤奋地应用适当的访问修饰符,特别是在我的库代码中,它开始在多个项目中变得有用。我已经编写了一些代码,并希望就其中的各种属性策略和锁定它们包装的成员变量征求意见。谢谢 using System; public class Program { static void Main(string[] args) { SomeValueType svt = new SomeValueType();

当需要多线程访问时,我一直在使用锁定值类型属性。此外,我一直想更加勤奋地应用适当的访问修饰符,特别是在我的库代码中,它开始在多个项目中变得有用。我已经编写了一些代码,并希望就其中的各种属性策略和锁定它们包装的成员变量征求意见。谢谢

using System; public class Program { static void Main(string[] args) { SomeValueType svt = new SomeValueType(); SomeReferenceType srt = new SomeReferenceType(); PermissionsAndLocking p = new PermissionsAndLocking(5, svt, srt); //Invalid. //p.X = 6; //Invalid //p.Svt = new SomeValueType(); //Invalid //p.Svt.X = 1; //Valid, but changes a copy of p.Svt because Svt is a value type. SomeValueType svt2 = p.Svt; svt2.X = 7; //Invalid //p.Srt = new SomeReferenceType(); //Valid, change the member data of p.Srt. p.Srt.X = 8; SomeReferenceType srt2 = p.Srt; srt2.X = 9; Console.WriteLine("Press the any key."); Console.Read(); } } public class PermissionsAndLocking { //_x cannot be changed outside the class. //_x cannot be changed "at the same time" it is being accessed??? private readonly object _xLock = new object(); private int _x; public int X { get { lock (_xLock) { return _x; } } private set { lock (_xLock) { _x = value; } } } //_svt and its members cannot be assigned to outside the class. //_svt cannot be changed "at the same time as" it is being accessed. private readonly object _svtLock = new object(); private SomeValueType _svt; public SomeValueType Svt { get { lock (_svtLock) { return _svt; } } private set { lock (_svtLock) { _svt = value; } } } //private on set works for = but member data can still be manipulated... //Locking isn't complete because the reference is returned and can be accessed at a later time??? private readonly object _srtLock = new object(); private SomeReferenceType _srt; public SomeReferenceType Srt { get { lock (_srtLock) { return _srt; } } private set { lock (_srtLock) { _srt = value; } } } public PermissionsAndLocking(int x, SomeValueType svt, SomeReferenceType srt) { _x = x; _svt = svt; _srt = srt; } } public struct SomeValueType { public int X; } public class SomeReferenceType { public int X; } 您应该始终锁定静态对象,因此应该将_svtLock标记为static,以使锁定生效。 _x不能在类外更改。符合事实的必须通过X进行更改。 如果您正确地实现了lock,请参见1,则在访问时无法更改x。
您需要阅读有关多线程和并发的内容。锁定是在不变量无效时保护它们,即,当不变量无效时,阻止对该不变量所依赖的共享内存的并发访问。第一步是了解代码例程具有什么不变量,第二步,在哪个代码块中不变量无效


例如,属性getter不需要与锁同步。它只读取属性值。进行此读取时,哪个不变量无效?可能需要锁定读取变量、递增变量,然后将递增的值写回属性的操作,但锁定单个getter和setter是完全不够的。整个操作,包括读和写,都必须在受保护的块内

Nate,你需要学习标记格式:特别是,代码需要缩进4个空格才能正确格式化。我一直在使用值类型属性锁定-希望你指的是引用类型。@TrueWIll,他想保护值类型属性…的确,在这种情况下,我有一个线程正在更改,另一个线程正在访问的数据。数据通过属性提供。我在考虑是否可以使用锁定来协调访问。第二段的要点很好。有点像带有比较/交换方法的联锁类。一次完成,全部锁定。所以,知道了这一点,你会说锁定和属性不能很好地混合。有没有一种方法可以正确处理财产?@Nate,没有,没有。多线程和并发太复杂了,不允许采用类似于金属的“一刀切”方法。您必须分析正在编码的每个功能操作,以确定是否暴露了易受攻击的共享内存。而解决问题的适当机制几乎总是严重依赖于场景,很少是琐碎的?如果我有一个非静态类,并且只希望锁定对该对象中成员数据的访问,该怎么办。我不想绑定该类型的所有对象,因为它们正在等待锁释放。@Ngu-1有几个错误。仅仅因为对象是静态的,就不足以要求锁定。私有静态只读int pi=3.1415;不需要锁这个,对吗?2.正确实现锁并不意味着不能更改共享内存。事实上,它根本无法阻止变量被更改。只有当可能更改的每个其他代码块x也位于使用完全相同的锁引用的锁块内部时,才能确保这一点。