花果山第一届猿类分级考试实录--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: 配置 ...
随机推荐
- JVM(十一):内存分配
JVM(十一):内存分配 在前面的章节中,我们花了大量的篇幅去介绍 JVM 内的内存布局.对象在内存中的状态.垃圾回收的算法和具体实现等.今天让我们探讨一下对象是如何分配内存的. 堆内存划分 前面说过 ...
- 搭建nuget 服务器
前言 搭建nuget服务器,这是上家公司进行类库管理的方式,其实优点很明显, 1.代码保密 2.代码重复利用效率高,这样不管任何项目只要知道nuget服务器地址就能直接调用 3.可进行版本任意切换提高 ...
- 浅谈UART/12C/TTL的定义与区别与解析
UART/12C/TTL的定义与区别: UART:UART(Universal Asynchronous Receive Transmitter):也就是我们经常所说的串口,基本都用于调试.主机和从机 ...
- 剑指Offer(十八):二叉树的镜像
剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...
- 谷歌移动UI框架Flutter教程之Widget
引言 在之间我已经介绍了关于Flutter的下载安装以及配置,还有开发工具Android Studio的配置,还不知道的同学可以看看我这篇博客--谷歌移动UI框架Flutter入门.这里为什么非要用A ...
- 分享各大CMS采集资源站网址合集
分享各大CMS采集资源站网址合集 http://www.172zy.xyz/ 172云资源 http://www.dbzyz.com/ 豆瓣云资源 http://www.gaoqingzy.com/ ...
- 牛客网2016.4.11(两个数相加为sum/计数一个int型的二进制有多少个1/二叉树是否左右对称)
求最小的两个数相加为sum //求最小的两个数相加为sum public ArrayList<Integer> FindNumbersWithSum(int [] array,int su ...
- Asp.NetCore源码学习[1-2]:配置[Option]
Asp.NetCore源码学习[1-2]:配置[Option] 在上一篇文章中,我们知道了可以通过IConfiguration访问到注入的ConfigurationRoot,但是这样只能通过索引器IC ...
- 人脸识别Demo
★.本实例使用百度智能云-人工智能-人脸识别API实现. ★.楼下安装了刷脸进门.闲暇时无聊写了个Demo 主界面显示如下图: 本实例,包括了所有人脸识别API的调用. 1. 创建楼号,对应API中创 ...
- SQL语言分类之DDL、DML、DCL、DQL
SQL 语言共分为四大类: 数据控制语言 DCL 数据定义语言 DDL 数据操纵语言 DML 数据查询语言 DQL 一.数据控制语言 DCL 1.1 作用 用来设置或更改数据库用户或角色权限的语句,并 ...