线程安全

线程安全一个程序和方法在面对任何多线程情况下都没有不确定,那么就是线程安全的. 线程安全主要通过加锁和减少线程之间互动的可能性来实现。通用类型很少全面线程安全的,由于以下几个原因:线程安全的开发负担非常重,尤其一个类型有很多字段时(每一个字段潜在与很多线程交互)。线程安全会降低了性能(正确的说,看它是否在多线程中使用)。线程安全不一定非要使用线程安全类型。因此,线程安全仅在需要的地方实现。然而,有一些方法来“欺骗”和有大而复杂的类安全运行在多线程环境下。其中一个是通过封装大片代码牺牲粒度–甚至访问完整的对象–在一个排斥锁中,强迫在高层串行化访问它。实际上,这种策略,在使用第三方不安全代码时是非常关键的(大多数框架类型)。这种技巧简单的使用一个相同的锁来保护一个不线程安全对象的所有字段,属性和方法。如果这个对象的方法执行的非常快,那么这种解决方案工作的非常好(否则,将大量阻塞)。原始类型之外,很少有框架类是线程安全的,这个保证应该是开发者的责任,通常使用排斥锁来实现。另外一种方法是通过最小化共享数据来最少化线程之间的互动。这是一个非常好的方法,常被用在无状态的中间层或Web服务页面。因为多个客户端请求能够同时到达,因此服务方法必须是线程安全的。一个无状态的设计(由于可扩展性非常受欢迎)内在限制了互动的可能性,因为类在请求之间不保持数据。线程互动仅在用于创建的静态字段,用于在内存中缓存常用的数据和提供基本服务,如授权和审计。最后一种方法是使用原子锁。.Net框架就是这样实现的,如果你子类化ContextBoundObject并使用Synchronization属性到类上。那么该对象的属性和方法无论在什么时候被调用,方法和属性的执行期间都会采取一个对象的原子锁。尽管,这减少了线程安全的负担,但它也带来了自己的问题:死锁不发生,可怜的并发性及意外的可重入性。由于这些原因,手动锁是更好的选择–至少在一个简单的自动锁能被使用之前。 线程安全和.NET框架类型锁可以使得非线程安全代码变得线程安全。.NET框架就是一个好的应用程序:几乎所有非原始类型在实例化时都不是线程安全的(仅只读的时候是安全的),然而它们能被用在多线程代码中,如果通过一个锁来保护对它的访问。下面是一个例子,两个线程同时添加一个Item到同一个List中,然后枚举这个list: SafeThreadExample这个例子中锁住了list本身。如果有两个相关的list,那么不得不选择在一个通用的对象上加锁(更好的办法是使用一个独立的字段)。枚举.NET集合也是线程安全的,如果在枚举期间list被修改,那么将抛出一个异常。在这个例子中,拷贝item到一个数组中,而不是在枚举期间锁住list。如果枚举过程非常耗时间,这避免了过分拥有锁(另外的解决方案是用读写锁)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值