PoEAA笔记- 并发-5.6 离线并发控制的模式-5.7 应用服务器并发

5.6 离线并发控制的模式

        如果可以把所有的业务都放在单个系统事务中完成,那么就这么做。如果可以忍受长事务带来的可伸缩性损失,那就这样做。通过把并发控制交给事务处理软件可以避免很多麻烦。
        处理并发问题首选是使用“乐观离线锁”,将它作为首选是因为易于编程实现,还能提供最好的灵活性。乐观离线锁通过版本号控制并发,而这也导致其局限性:只能在提交数据的时候才知道业务事务将要失败,而且在某些情况下,发现失败太迟代价会很大。用户可能花了一小时录入信息,然后提交时出错,会让用户对系统失去信息。另一个方法是使用“悲观离线锁”,它可以尽早的发现错误,但更难以编程实现,而且会降低系统的灵活性。
        使用这两种方法,可以通过不给每个对象都加锁来减少相当一部分麻烦。“粗粒度锁”允许以一组对象为单位管理并发。另一个对应用开发人员较为简单的方法是使用“隐含锁”,可以不用直接管理锁,这不但减少了工作量,也减少了由于疏忽而产生的错误——而这是很难发现的。
        选择乐观方式还是悲观方式会影响用户对整个系统的感觉。一个明智的“悲观离线锁”设计需要很多关于领域的信息,类似的,选择好的“粗粒度锁”也需要领域知识。

5.7 应用服务器并发

        多线程编程太复杂了,很容易引入一些极难发现的错误。因此我们的策略是尽可能避免显示的处理同步和锁。应用开发人员几乎不用接触到显示的并发机制。最简单的处理方法是每会话一进程,但进程的系统开销很大,可以使用进程池来提高利用率。可以进一步通过在一个进程中运行多个线程进一步提高吞吐率。每会话一线程的问题是线程之间没有隔离,任何线程都能访问它能访问的数据。
        如果使用每会话一线程,最重要的是创建和进入一个隔离区,在隔离区中应用开发人员可以忽略多线程问题,最常用的方法是让线程每次创建新的对象来处理请求。这时对象是隔离的,因为其他线程无法引用它们。
        很多开发人员非常担心新对象的创建。因为他们被告知创建新对象是一个昂贵的过程。因此他们经常缓存对象,使用缓存的问题是必须使用某种同步的方式访问资源,而对象创建的代价与虚拟机与内存管理机制有关。
        开发人员需要注意一些问题,一是静态的基于类的变量必须使用同步。对于单例对象也是这样,如果用到某种全局内存空间,请使用“注册表”,你可以以这样一种方式实现:让它看上去像一个静态变量,但实际上它使用的是针对线程的内存空间。
        即使能为会话创建新对象使得情况相对安全。这些对象的创建代价仍是比较高,并因而需要别处的处理,最常见的例子就是数据库连接,为了处理这个问题,你剋呀将这些对象放入一个显示的缓冲池当中,当需要时从缓冲池中取得一个连接,用完后放回来,这些操作都需要同步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值