本故事纯属虚构,如有雷同,纯属巧合!

故事背景

悟空师徒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的更多相关文章

  1. 「CSP」第一届提高组考后总结

    「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...

  2. 《WePayUI组件设计的秘密》——2016年第一届前端体验大会分享

    本文是博主参加第一届前端体验大会 | 物勒工名做的分享<WePayUI组件设计的秘密>,内容主要分为2个部分: 一.浅析UI库/框架的未来 讨论的UI库或者框架,主要包含展示和交互的css ...

  3. 第一届山东省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 ...

  4. 第一届山东省ACM——Balloons(java)

    Description Both Saya and Kudo like balloons. One day, they heard that in the central park, there wi ...

  5. 中南大学第一届长沙地区程序设计邀请赛 New Sorting Algorithm

    1352: New Sorting Algorithm Time Limit: 1 Sec  Memory Limit: 128 MB Description We are trying to use ...

  6. 中南大学第一届长沙地区程序设计邀请赛 To Add Which?

    1350: To Add Which? Time Limit: 1 Sec  Memory Limit: 128 MB Description There is an integer sequence ...

  7. NUnit实战,第一个测试类,测试事件触发是否是并行的

    以前测试都是新建一个控制台测试的方式来进行,感觉版本管理啥的非常麻烦.也是非常原始的办法.后来想以前有写过测试单元,不过好久没弄了.Nuget了NUnit后写了正式的第一个测试类. 测试用例: 测试事 ...

  8. 江西财经大学第一届程序设计竞赛 G题 小Q的口袋校园

    链接:https://www.nowcoder.com/acm/contest/115/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  9. 关于Unity中FPS第一人称射击类游戏制作(专题十)

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置 ...

随机推荐

  1. Mac如何前往文件夹 修改hosts文件 显示隐藏文件 Mac如何查看剪切板

    Mac 如何前往文件夹 首先,回到桌面,或者点击Finder(访达) 然后输入快捷键 ⌘ Command + ⇧ Shift + G 或者在Finder上方状态栏中点击‘前往’>>> ...

  2. 【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  3. 使用charls抓包微信小程序的解决方案(终极解决,各种坑不怕,亲测可用,不服来战!)

    第一步:使用charles进行https抓包 https://www.jianshu.com/p/7a88617ce80b   使用charles进行https抓包 使用Charles进行HTTPS抓 ...

  4. react中babel的使用

    在开发中经常会使用到es6语法,那么如何能够很好兼容es6写法呢

  5. pip升级命令

    pip升级命令 $ python -m pip install --upgrade pip

  6. 纯数据结构Java实现(6/11)(二叉堆&优先队列)

    堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...

  7. MySQL MGR集群单主模式的自动搭建和自动化故障修复

    随着MySQL MGR的版本的升级以及技术成熟,在把MHA拉下神坛之后, MGR越来越成为MySQL高可用的首选方案.MGR的搭建并不算很复杂,但是有一系列手工操作步骤,为了简便MGR的搭建和故障诊断 ...

  8. pyhton介绍、发展趋势、安装

    pyhton介绍.发展趋势.安装 一.python起源 ​ pyhton的创始人为吉多·范罗苏姆(Gudio van Rossum) (后文简称龟叔) ​ 1. 1989年的圣诞节期间,龟叔为了在阿姆 ...

  9. MYSQL批量导入数据报:[Err] 2006 - MySQL server has gone away 解决方法

    使用values 后接批量数据插入,因mysql 系统参数设置导致失败(数据量过大).可通过临时修改系统参数来解决,对系统安全性无影响: set global max_allowed_packet=1 ...

  10. HDU 6134

    题意略. 思路: 我们先不考虑[(i , j) == 1],在此情况下,其实这个值是sum( [ (i , j) == 1,2,3,....,n ] ) 这些情况.我们要求的仅仅是其中的第一部分而已. ...