程序如何防止并发

(个人的开发心得,请勿全信,用来备忘的,大侠请留言指点)

一、并发的场景

      1、用户访问并发(一般发生在用户数量多,访问同一个功能频繁)

      2、程序处理并发(一般发生在多线程访问)

      3、数据库读写并发(一般发生事物之间导致脏读脏写)

二、处理思路

     很多情况下,我们遇到并发的问题,往往会寻找技术解决方案。然而很多情况下,我们改变程序处理流程就会使问题变得很简单。

     1、用户访问并发

          用户访问导致的并发,往往发生在同一请求被很多用户访问。

          解决方案1、添加同步关键字synchronized,ok,问题是解决了,但是程序处理效率降低n倍

          解决方案2、添加服务器做负载均衡,ok,问题解决了,公司有钱建议这样搞

          解决方案3、修改功能将一个请求变成多个请求拆解程序、让用户经过step1、step2、step3等步骤完成请求,ok,问题同样可以解决,如果在页面上下点功夫,消除用户多点几下按钮的烦恼,这种解决方案是最划算的。


     2、程序处理并发,一帮发生在启用多线程做批量任务的时候出现。

          要把握并发的最小粒度,例如:对用户账户的读写操作,这种多线程对单条记录进行操作时需要采用锁的机制,根据业务情况采用乐观锁或悲观锁。

         ok,除了这种情况,其他使用队列机制可以很好解决问题。

         第一步,单线程读取需要处理的记录(注意这里是单线程,规避重复读)。第二步,写入缓存队列(这里最好用redis等缓存数据库技术,避免服务器故障导致程序中断)。第三步,启用线程池,读取队列进行业务处理。

     3、数据库级别的并发

          只能通过事物隔离等方式解决,没实际使用过。不写了






猜你喜欢

转载自blog.csdn.net/xiasihua88/article/details/51679231