给自己写的程序挑毛病(r12笔记第68天)

前几那天写了一个Java程序模拟生产者消费者,当时写完还感觉不错,但是这几天再看的时候发现还是有很多的不足之处,给别人挑毛病不大好意思,尺度拿捏不好还容易得罪人,男人就对自己狠一点,我就给自己多挑挑程序的毛病,这个可以有,有些细微的毛病就马上改了,有些有难度的,我也记录下来,不断的改进,看起来简单的程序写好了才算是一个合格的程序员。

感兴趣的同学可以移步这里,看看之前写的程序。

Java实现生产者消费者的两种方式(r12笔记第66天)

我大体总结了下,从日志中可以看出有这么几个明显的小问题。

  1. 第一种模式和第二种模式的线程数不同,明显第二种模式的线程日志有长得多。
  2. 第二种模式的消费者申请的消费产品数和规格不符,应该为10的倍数,第二种模式没有取整,这样看起来不是很清晰。
  3. 第一种和第二种模式,生产者和消费者对应的产品数不能为0,这种场景其实不应该存在的,所以就可以考虑从随机数或者从对象层级进行校验,至少规范来看,入参要规范,所以我从随机数生成逻辑上进行校验控制。
  4. 生产线程和消费线程虽然是动态生成,但是从日志可以看到有明显的串行执行的痕迹,可以把这个过程做成真正的动态,库存不足,生产者生产,库存充足,消费者消费。如果把生产者消费者这个模型看做是一个系统,就好比一个齿轮,一个直接的目标就是让齿轮转动的快。
  5. 无论第一种模式还是第二种模式,如果碰到条件不满足的情况就会存在等待的情况,这个等待的频率可以借鉴一些数据库层面的经验,来优化控制一下,比如第一次等待,sleep多少毫秒,第二次sleep多少毫秒,这样有一个基本的控制范围,减少中断的次数。
  6. 这个库存其实就像MySQL面刷脏页一样,脏页数达到多少的时候来触发生产者生产,能够尽可能减少生产者等待的频率,提高消费者消费的频率。
  7. 其实目前的实现,如果细细想来,原本生产者消费者的性能瓶颈现在落到仓库上,但是目前仓库应该有几个门,控制入库,控制出库,而不能总是在一个门里,要么把门加宽,要么多加几个门,入口和出口分开。
  8. 为了尽可能提高吞吐量,整个实现过程也可以考虑通过事务的方式来控制,比如放到一个仓库的表里,对于数据进行实时的变更和查询,或者使用其他的数据结构。
  9. 为了尽可能突破单个仓库的瓶颈,可以考虑设置多个仓库,这样库存能够大大大提高,而且是一个线性扩展的方式,当然这就会引进更多的考虑和方案
  10. 尽可能提高消费者线程的使用率,比如考虑使用线程池等等方式来实现。

最后硬凑一个观点吧,那就是一个牛叉的程序构思好了,能够在短时间内实现出来,光说不做太虚,能说能做才是真。

或者说你有更多的建议,也给提提吧,感激不尽。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2017-05-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小特工作室

WinFom中经典小游戏(含源码)

  最近整理了若干经典的小游戏,无聊时可以打发时间。程序本身不大,练手非常不错,主要是GDI编程,主界面地址如下图所示 ? 源码下载方式 1,关注微信公众号:小...

2505
来自专栏IT技术精选文摘

微信支付商户系统架构背后的故事

PostgreSQL-XC在事务管理系统方案本身有一个明显的缺点,那就是事务管理机制会成为系统的瓶颈,GTM(Global Transaction Manage...

1591
来自专栏小石不识月

使用 Micro 构建弹性与容错的应用程序

自上一篇博客发布以来,已有一段时日了,此间我们一直在努力研究 Micro,并且已经初见成效。现在让我们一起深入探讨吧!

3313
来自专栏我是攻城师

分布式日志收集之Logstash 笔记(二)

3336
来自专栏晓晨的专栏

ASP.NET Core的身份认证框架IdentityServer4(1)-特性一览

1113
来自专栏java一日一条

程序员编程的 7 + 1 条小贴士

用10分钟,20分钟甚至30分钟的时间来想想你需要什么,想想什么样的设计模式(如果有的话)适合你将要编码的东西。真的要好好想想,你会很庆幸“浪费”了那几分钟,当...

603
来自专栏美团技术团队

从0到1:构建强大且易用的规则引擎

引言 2016年07月恰逢美团点评的业务进入“下半场”,需要我们在各个环节优化体验、提升效率、降低成本。技术团队需要怎么做来适应这个变化?这个问题直接影响着之后...

2K11
来自专栏程序人生

思考,快与慢

吐槽:GitBook editor 有个二B的设计-当它莫名检测出文件被外星人修改后,会弹个无法取消的对话框-检测出外部修改,ignore? discard? ...

3057
来自专栏魏琼东

AgileEAS.NET SOA中间件平台更新日志 2015-04-28

     AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平...

1040
来自专栏信安之路

第一季从攻击者角度来对抗

当我们接到某个项目的时候,它已经是被入侵了。甚至已经被脱库,或残留后门等持续攻击洗库。

1040

扫码关注云+社区

领取腾讯云代金券