花果山第一届猿类分级考试实录--Talk is cheap,Show me the code
本故事纯属虚构,如有雷同,纯属巧合!
故事背景
悟空师徒4人取经回来后,因不耐收到管教,就回到了花果山,带领一帮猴子猴孙逍遥自在的过日子,奈何因在阎王殿里将生死薄中的猴子猴孙的名字都划去了,猴子猴孙是越来越多。
悟空最是没有耐心的,无法一一管教,随向太白金星讨教。
猿类分级考试
太白金星给了主意:考试分级。
并且给出了题目:
创建一个通用的计数器,能计量很多的东西,如金箍棒。
参考答案如下:
猿类分阶:一~九等级 依次上升
一阶猿类
public class Counter1 {private static int cnt=0;public int increase() {return ++cnt;}public int decrease() {return --cnt;} }
旁白:实现了功能。
二阶猿类
public class Counter2 {private static long cnt=0;public long increase() {return ++cnt;}public long decrease() {return --cnt;} }
旁白:考虑了int的范围限制,long的范围更广泛。
三阶猿类
public class Counter3 {private static long cnt=0;public synchronized long increase() {return ++cnt;}public synchronized long decrease() {return --cnt;} }
旁白:考虑了并发环境下的执行
四阶猿类
public class Counter4 {private static AtomicLong cnt=new AtomicLong(0);public long increase() {return cnt.getAndIncrement();}public long decrease() {return cnt.getAndDecrement();} }
旁白:考虑了并发环境下的cas性能更优
五阶猿类
public class Counter5 {private static LongAdder cnt=new LongAdder();public long increase() {cnt.increment();return cnt.longValue();}public long decrease() {cnt.decrement();return cnt.longValue();} }
旁白:在单线程下,并发问题没有暴露,两者没有体现出差距;随着并发量加大,LongAdder 的 increment 操作更加优秀,而 AtomicLong 的 get 操作则更加优秀。鉴于在计数器场景下的特点—写多读少,所以写性能更高的 LongAdder 更加适合。
六阶猿类
public class Counter6 {private static JdbcTemplateUtils jdbc=new JdbcTemplateUtils();private static long cnt=0;public long increase() {cnt=jdbc.getCnt(); return jdbc.setCnt(++cnt);}public long decrease() {cnt=jdbc.getCnt();return jdbc.setCnt(--cnt);;} }
旁白:考虑了在集群环境下保证数据的唯一性和一致性。
七阶猿类
public class Counter7 {private static RedisclusterUtils redis=new RedisclusterUtils();private static long cnt=0;public long increase() { return redis.incr(cnt);}public long decrease() {return redis.decr(cnt);;} }
旁白:考虑了计数器集群下的并发性能问题,同样的实现可以使用zk或者mongo等内存数据库。
八阶猿类
public class Counter8 {private static JdbcTempalteUtils jdbc=new JdbcTempalteUtils();private static RedisclusterUtils redis=new RedisclusterUtils();private static long cnt=0;public long increase() { if(redis.exsits(cnt)) {return redis.incr(cnt);}cnt=jdbc.getCnt(key);++cnt;redis.set(key,cnt);return cnt;}public long decrease() {if(redis.exsits(cnt)) {return redis.decr(cnt);}cnt=jdbc.getCnt(key);--cnt;redis.set(key,cnt);return cnt;} }
旁白:考虑到redis宕机或者不可用的情况下的处理,有备份方案。
九阶猿类
这个要免考的。
参考资料:
【1】https://mp.weixin.qq.com/s/yAvJFZWxfKb38IDMjQd5zg
转载于:https://www.cnblogs.com/davidwang456/p/11550965.html
花果山第一届猿类分级考试实录--Talk is cheap,Show me the code相关推荐
- 元宇宙产业委员会发布《第一届第六次主任委员会议公报》
2022年12月29日中国移动通信联合会元宇宙产业工作委员会第一届第六次主任委员会议书面召开,共同主席3人.学术指导3人.产业指导3人,联席主任委员3人.执行主任委员4人.常务副主任委员9家/人.副主 ...
- 第一届中国人工智能技术与应用大会在京召开
10月20日,由中国电子信息产业发展研究院主办,中国计算机报社.中国软件评测中心承办的"第一届中国人工智能技术与应用大会暨人工智能60周年颁奖典礼"在北京国宾酒店隆重举办.大会围绕 ...
- Bio-protocol第一届生物实验短视频大赛集锦(三)——软件使用篇
点击上方蓝字关注 Subscribe for more 看了去年大赛基础操作和仪器使用类获奖作品的分享集锦,相信大家一定从中得到了不少启发.除此之外,日常科研生活自然也少不了分析软件的应用,在上届比赛 ...
- 濮阳第二届创客机器人比赛_咸阳市举行第二届机器人大赛暨第一届创客大赛
11月14日,由陕西省教育信息化管理中心指导,市教育局主办,咸阳师范学院.市少工委协办的咸阳市第二届机器人大赛暨第一届创客大赛在咸阳师范学院举办. 各个学校的同学展示自己的发明创造.咸阳日报全媒体记者 ...
- 计算机信息学院运动会入场式,厦门大学信息学院第一届新生运动会成功举办
10月13日,厦门大学信息学院第一届新生运动会在翔安校区一期操场举行.学院党委副书记李承华.杨蔷,智能系副主任江敏.团委书记唐腾凤,团委副书记李绍玉.黄艺明.刘茜和全体在校辅导员老师出席了运动会.开幕 ...
- 重庆市对口高职计算机类专业vfp,重庆市2015年普通高校对口招收中职毕业生专业技能计算机类技能考试大纲...
2021年高职单招升学一对一咨询李剑颖:15178744863(微信) 计算机类技能考试大纲 一.考试性质 2015年重庆市中职对口 二.考试依据及要求 1.考试依据 (1)教育部中等职业学校计算机类 ...
- 华为北京研究所第一届黑客马拉松比赛-基于Android防止儿童走失
简介 这个项目是在2016年华为研究所举办的第一届黑客马拉松比赛时开发的项目,这个项目是借鉴之前写Android人脸对比,想出一个关于防止儿童走失的想法,然后增加浏览历史和定位失踪儿童以及推送附近人的 ...
- [新闻摘录]第一届山西省互联网大会(2015.07.03召开)概要
本文由Markdown语法编辑器编辑完成. http://www.sx.xinhuanet.com/ztjn/hlw.htm 一.山西跑步进入"互联网+"时代 2015年7月3日, ...
- 也说说家养猿类养成套路
作为猿厂公众号的开(说)篇(说)巨(而)著(已),打算聊聊成为家养猿类的套路.家养的猿类?还有野生的不成?这里的家养是指在厂里搬砖,比如鹅厂.猫厂.猪场.狗场,夫妻店等等...野生的就不好分类了,大多 ...
最新文章
- 解决xcode ***is missing from working copy
- 分形:一种计算出来的花朵
- [BZOJ 1012] 最大数maxnumber
- Memory与Merge特性
- CBA Opportunity Fiori应用的getEntitySet实现
- 修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题
- 【CodeForces - 569A】Music (数学公式化简,模拟追及问题)
- Linux Redhat下安装Jenkins
- Linux IPC之有名管道
- Nagios_快速配置
- 分页存储过程--From:桌面备份 - sql2005新功能.docx
- IOS中通知中心NSNotificationCenter应用总结
- Entity Framework Configuring Relationships with the Fluent API
- python插件安装包_Python的插件安装
- G6 3.1 线条的属性
- 【C语言-11】Bingou! ~~~~三个数字从大到小排排坐~~
- D3D坐标系统下3D世界坐标映射到2D屏幕坐标的平移矩阵
- Java 获取当前时间前一个小时的时间
- python控制安卓手机的闹钟_【玩转Python】为女朋友打造一款智能语音闹钟
- ubuntu16.04+cuda10.1安装opencv-3.3.0
热门文章
- IDEA中pom.xml中导入spring-boot-starter-thymeleaf报错的解决方案
- 台式计算机桌面待机时间怎么调,如何设置电脑屏幕待机时间
- 如何使html中的din居中,HTML+CSS--position大法好
- 闭式系统蒸汽管径推荐速度_闭式空调系统管径选用表
- java自动化初始变量_Java自动化测试-01.环境准备(JDK/环境变量/Intellij IDEA安装)
- lex编译dos命令_微软新的命令行工具:Windows Terminal
- Android短信拦截2019,关于征集2019年度信息科学领域重大项目立项建议的通告
- Qt中的QFontDialog
- mysql range用法_MySQL的常用函数
- ai怎么画循环曲线,怎么用 Adobe Illustrator 画出曲率连续的曲线?