尽可能地减小锁对象的作用范围

在编写并发程序时,我们需要选择最合适的同步原语。应用程序中对同步原语时用得越多,也就越难以避免发生死锁等并发上得错误。这是个规模的问题:需要检查得地方越多,也就越难发现某个特定得错误。 在面向对象编程中,我们使用私有成员变量来尽可能减少发生状态变化的位置的数量。在并发程序中,同样也应该尽可能地减小用来实现同步对象的作用范围。 我们需要改变锁定的策略,你可以采用下面将要介绍的三种方法。 第一种方法是,若你需要保护整个一个方法,那么可以使用MethodImpAttribute属性来指定该方法是同步的。 「MethodImpl(MethodImplOptions.Synchronized)」 public void IncrementTotal() { total++; } 不过显然,这种需求并不常见。 第二种方法是,强制所有地开发者都必须尽锁定当前的类型或当前地对象,即使用lock(this)或lock(MyType)。若是每个人都遵守该规则地话,那么也不会出现什么问题。不过若想达到这个目标,需要你的程序的每个使用者都清楚地了解并遵守这个规则,即只能够锁定当前对象或当前类型,而不能是别的对象。这种理想的假设显然不够现实。 第三种则是最好的方法。你可以在类中创建一个同步的对象,专门用来保护访问共享的资源。该同步对象是一个私有成员变量,因此无法在类型之外访问到。你也可以保证该同步对象为私有,且不能被任何非私有属性访问。 若你发现需要在某个类中创建不同de 的锁对象,那么或许应该考虑将该类拆分成多个类。因为该类做的事情太多了。若是需要保护对某些变量的访问,同时也需要用其他的锁来保护类中其他的变量,那么则非常建议你将类拆成具有不同责任的类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值