1.对于一个lock对象来说,例如 ClassAB a = new ClassAB();
能否可以直接
能否可以直接
lock(a) { 对a进行读写操作。 }
2.假如以上操作可行,
ClassAB a = new ClassAB(); ClassAB b = a; lock(a) { } lock(b) { }
能否是锁定同一个对象,假如是,那么能否可以
//在线程A中 lock(a) { //写入数据 } //在线程B中 lock(b) { //读取数据 }
3.关于锁定值对象 http://bbs.csdn.net/topics/350121566
装箱是什么意思? 值类型装箱和引用类型装箱有什么区别? 重新新开辟内存?
解决方案
20
1、可以。但不推荐(另帖解释)。
2、是锁定同一个对象(a和b是同一个对象)。
3、’装箱‘就是把值类型,拷贝到引用类型里。因此,以下代码一定是错的(原因是每次装箱都创建一个新的引用对象)。
int i = 0;
lock(i)
{
}
2、是锁定同一个对象(a和b是同一个对象)。
3、’装箱‘就是把值类型,拷贝到引用类型里。因此,以下代码一定是错的(原因是每次装箱都创建一个新的引用对象)。
int i = 0;
lock(i)
{
}
15
ClassAB a = new ClassAB();
//…
lock(a)
{
对a进行读写操作。
}
之全部不推荐使用上述代码,原因是对资深程序员来说:
对a进行读写操作的正确性,依赖于别人能正常的lock(a)。因此可能会有如下错误发生:
1、其他程序员,甚至你本人,忘了lock(a)。
2、其他程序员使用lock(a)来同步其他无关操作,导致无法及时对a进行读写操作,甚至导致死锁。
因此,为避免上述错漏,一般lock的对象应是私有对象。例如推荐写法如下:
//…
lock(a)
{
对a进行读写操作。
}
之全部不推荐使用上述代码,原因是对资深程序员来说:
对a进行读写操作的正确性,依赖于别人能正常的lock(a)。因此可能会有如下错误发生:
1、其他程序员,甚至你本人,忘了lock(a)。
2、其他程序员使用lock(a)来同步其他无关操作,导致无法及时对a进行读写操作,甚至导致死锁。
因此,为避免上述错漏,一般lock的对象应是私有对象。例如推荐写法如下:
public class ClassAB { private object lockObj = new object(); // 私有对象 int rCount = 0, wCount = 0; public void 读操作() { lock (lockObj) { this.rCount++; // 其他读... }; } public void 写操作() { lock (lockObj) { this.wCount++; // 其他写... } } }
5
可以用
Queue.Synchronized
Queue.Synchronized