关于lock引用的问题

.Net技术 码拜 7年前 (2017-04-20) 1266次浏览
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)
{
}

15

ClassAB a = new ClassAB();
//…
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

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于lock引用的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)