花果山第一届猿类分级考试实录--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
花果山第一届猿类分级考试实录--Talk is cheap,Show me the code的更多相关文章
- 「CSP」第一届提高组考后总结
「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...
- 《WePayUI组件设计的秘密》——2016年第一届前端体验大会分享
本文是博主参加第一届前端体验大会 | 物勒工名做的分享<WePayUI组件设计的秘密>,内容主要分为2个部分: 一.浅析UI库/框架的未来 讨论的UI库或者框架,主要包含展示和交互的css ...
- 第一届山东省ACM——Phone Number(java)
Description We know that if a phone number A is another phone number B’s prefix, B is not able to be ...
- 第一届山东省ACM——Balloons(java)
Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...
- 中南大学第一届长沙地区程序设计邀请赛 New Sorting Algorithm
1352: New Sorting Algorithm Time Limit: 1 Sec Memory Limit: 128 MB Description We are trying to use ...
- 中南大学第一届长沙地区程序设计邀请赛 To Add Which?
1350: To Add Which? Time Limit: 1 Sec Memory Limit: 128 MB Description There is an integer sequence ...
- NUnit实战,第一个测试类,测试事件触发是否是并行的
以前测试都是新建一个控制台测试的方式来进行,感觉版本管理啥的非常麻烦.也是非常原始的办法.后来想以前有写过测试单元,不过好久没弄了.Nuget了NUnit后写了正式的第一个测试类. 测试用例: 测试事 ...
- 江西财经大学第一届程序设计竞赛 G题 小Q的口袋校园
链接:https://www.nowcoder.com/acm/contest/115/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 关于Unity中FPS第一人称射击类游戏制作(专题十)
当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置 ...
随机推荐
- 100天搞定机器学习|Day22 机器为什么能学习?
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- 开发规范 小白进阶 python代码规范化
开发规范 软件开发,规范项目的目录结构,代码规范,遵循 PeP8规范等等,让你更加清晰的,合理开发 一功能分类(文件名) settings.py配置文件 配置文件放一些静态参数, 划归固定的路径,文件 ...
- MVC + EFCore 完整教程19-- 最简方法读取json配置:自定义configuration读取配置文件
问题引出 ASP.NET Core 默认将 Web.config移除了,将配置文件统一放在了 xxx.json 格式的文件中. 有Web.config时,我们需要读到配置文件时,一般是这样的: var ...
- c++ 按位或
|=是位操作运算符的一种,其形式为:a|=b代表的含义为a=a|b;即把a和b做按位或(|)操作,结果赋值给a.按位或的计算规则为:1 逐位进行计算:2 计算数的同位上值,如果均为0,则结果对应位上值 ...
- Linux Capabilities 简介
为了执行权限检查,Linux 区分两类进程:特权进程(其有效用户标识为 0,也就是超级用户 root)和非特权进程(其有效用户标识为非零). 特权进程绕过所有内核权限检查,而非特权进程则根据进程凭证( ...
- Vuex模块化
上图是vuex的结构图vuex即 store, 包含State,Action,Mutations, 每一个vue项目都需要使用vuex做组件之间的数据共享 使用场景: 数据最终存放在store的Sta ...
- JS核心之DOM操作 上
JS一个重要功能就是操作DOM, 改变页面显示. 目录: 1.基本概念 2.节点类型 3.节点关系 4.节点操作 基本概念 DOM全称为Document Object Model ,即文档对象模型,是 ...
- fdfsdf
名称:字符串 来源:2019年陕西省选 题目内容 传送门 洛谷(P5392) 题目描述 给出一个长度为$n$的由小写字母组成的字符串$a$,设其中第$i$个字符为$a_i(1≤i≤n)$. 设删掉第$ ...
- 牛客小白月赛4 J 强迫症 思维
链接:https://www.nowcoder.com/acm/contest/134/J来源:牛客网 题目描述 铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这 ...