`
ajoo
  • 浏览: 449805 次
社区版块
存档分类
最新评论

瓜娃之走马观花 (2) - Make me a Map as fast as you can

阅读更多
古人云 (无图无真相, 有美女走光图为证):
引用
Pat-a-map, Pat-a-map, maker's man,
Make me a map as fast as you can...




这集要讲的工具叫MapMaker.

顾名思义, MapMaker就是帮你做Map滴, 而且是as fast as it can! 实在是居家旅行, 制作Map的必备工具啊!

可是啊, 这计算机一思考, 你就笑了: "小样儿, 做Map还用你做啊? 当我文盲?" 不就是:
new HashMap<姓名, 奖金>()
嘛. 如果用上回书提到的Maps就是:
Maps.newHashMap();

再不, 用ImmutableMap, 就是
ImmutableMap.of("ajoo", 10000000000000000);


计算机: 这个, 这个, 啊, (耳语: 老大, 别这么不给面子啊. 出来混都不容易), 我们这里讲的不是HashMap, 也不是ImmutableMap, 其实是代表着当代最最高科技的
java.util.concurrent.ConcurrentMap
, 它适合多线程操作, 高并发, 无阻塞, 无死锁, 无冲突, 无测漏, 无...

你: 等等, 你是在说:
new ConcurrentHashMap<姓名, 奖金>()
这么简单到离谱的东西么?

计算机: 这个, 别急, 别急. 其实不完全是. MapMaker提供了更多更强大的功能. 比如可以指定键是否用弱引用, 指定一个键多长时间过期之类的. 但是最最最有用的, 是那个makeComputingMap()函数.

画面一转, ajoo平易近人地微笑着说: 对啦! 这也就是我今天要讲MapMaker的主要原因.

大家想一想, 平时有没有需要做延迟初始化(所谓lazy initialization)和缓存的? 比如说, 我要对每一个需要用到的员工名字通过数据库查询她一年以来的加班多少, 加班是否自觉自愿, 漂亮程度, 身材和三围指标, 领会领导意图能力, 帮领导挡酒总加仑数等等等等各种数据, 最后经过一个NP问题的近似解决算法来得到员工的奖金数额.

这个东西算起来太费资源, 弄不好比奖金本身还多. 那么, 就要延迟计算, 只有员工主动跑来跟我要加薪, 我才去算. 而且要缓存, 如果这个员工对只发50元奖金心存不满, 反复来吵闹, 甚至投诉, 我们不用重新计算.

一般如果你自己写怎么写呢? 假设我那个算奖金的函数写好了, 就叫computeBonus(姓名). 这样么?

class BonusManager {
  private final Map<姓名, 奖金> cache = new HashMap<姓名, 奖金>();

  奖金 getBonus(姓名 name) {
    奖金 bonus = cache.get(name);
    if (bonus == null) {
      bonus = computeBonus(name); // 危险在这里!
    }
    cache.put(name, bonus);
    return bonus;
  }
}


其实主要逻辑是这样的. 问题是这个实现不是多线程安全的.
你可以在getBonus()上面加一个synchronized关键字, 然后它就线程安全了. 但是, 让我们假设我们是个跨国知名连锁大托拉斯, 需要极高极高的并发能力.

聪明如你一定会想到把HashMap改成ConcurrentHashMap.

近了一步了, 但是还不完全. 这是因为两个线程可能同时执行if (bonus == null)然后同时去运行computeBonus(). 结果是, 我们可能对某些名字重复运行computeBonus(). 让我们再假设老板遇到这种你给公司浪费了资源的情况会炒你鱿鱼的.

呵呵, 到这里, 如果你想到了双检查锁机制(所谓的double-checked locking), 那算你狠, 遇到你们这种聪明到煞风景的听众我真是无话可说, 卷帘朝散, 请假还宫!

而如果你没想到, 那么, 恭喜你, 你答对啦! 奖河南双汇火腿肠一根(94年珍藏版).

我想说的, 其实是, 俺也不知道怎么写最好. 所以呀, 最好是不写. 反正MapMaker都给咱写好了不是? 人生苦短, 当及时行乐啊, 同志! 有闲功夫多洗几块尿布好不好?

那么, 不卖关子了 (等不及已经看了javadoc文档的同志们都已经自己写出来了. 俺再摇头晃脑故作玄虚恐怕就要吃臭鸡蛋, 烂西红柿伺候咯). 请看. 当当当当 (贝多芬第九交响曲响起)!

ConcurrentMap<名字, 奖金> cache = new MapMaker()
    // 如果一个计算一年有效 (嗯, 明年奖金减半!), 那么设一个过期时间
    .expiration(365, TimeUnit.DAYS)
    .makeComputingMap(new Function<名字, 奖金>() {
      @Override public 奖金 apply(名字 name) {
        return computeBonus(name);
      }
    });


就是这么简单. 等等, 我先摆个pose先, 样子屌不屌?

这里面唯一需要解释的就是这个Function. 大家都知道, java是一门罗唆的语言艺术, 讲究说学逗唱, 不是, 说错了, 讲究类, 方法, 表达式, 匿名类等等等等, 反正是怎么写累人怎么来. 这里的目的其实就是告诉makeComputingMap()怎样"compute". 这个function是个匿名类, 它的apply()函数封装了怎么计算这么一个概念. (哎呀, 手都打酸了)

然后, makeComputingMap()就接手过去, 它内部怎么搞的咱不关心, 反正我上面想要的功能它全实现了, 这就够了呗.

行了, 洗尿布去了.

未完待续
10
3
分享到:
评论
11 楼 zhy6599 2011-08-24  
94年的双汇火腿那可是美味啊 
10 楼 huang_yong 2010-11-25  
MapMaker讲解非常生动!
是不是打算把weak和soft放在下一章讲解?这个概念非常重要哦!
9 楼 Javakeith 2010-11-13  
LZ 真幽默!
8 楼 javaliver 2010-08-19  
java是一门罗唆的语言艺术, 讲究说学逗唱, 不是, 说错了, 讲究类, 方法, 表达式, 匿名类等等等等, 反正是怎么写累人怎么来
7 楼 RednaxelaFX 2010-08-16  
raojl 写道
mapmaker 在哪有?

com.google.common.collect.MapMaker
google-collectionsguava里都有。
6 楼 raojl 2010-08-16  
mapmaker 在哪有?
5 楼 RednaxelaFX 2010-08-15  
dogstar 写道
ajoo终于死灰复燃了.哈. NS,我也悄悄的加入了依赖,自己偷着用着乐.哈

追随你们的步伐加入了瓜娃的依赖。原本就已经有对Google Collections的依赖了,切换到Guava没啥大障碍。
4 楼 dogstar 2010-08-15  
ajoo终于死灰复燃了.哈. NS,我也悄悄的加入了依赖,自己偷着用着乐.哈
3 楼 ajoo 2010-08-15  
night_stalker 写道
逾墙看图发现被骗了…… 已经悄悄在工程中添加了瓜娃的 dependency

坏淫啊
2 楼 cxqdji 2010-08-14  
1 楼 night_stalker 2010-08-14  
逾墙看图发现被骗了…… 已经悄悄在工程中添加了瓜娃的 dependency

相关推荐

    第1讲-引论-走马观花看导论.pptx

    第1讲-引论-走马观花看导论.pptx

    单片机实例-走马观花

    本实例针对初学。简洁,易懂,程序可以用来作模板。。希望我的作品,能成为你的作品。

    关于走马观花灯的单片机实训报告概要.pdf

    关于走马观花灯的单片机实训报告概要.pdf

    Java程序设计高晓黎走马观花看PPT教案学习.pptx

    Java程序设计高晓黎走马观花看PPT教案学习.pptx

    八年级地理下册 第七章 第二节 澳门特别行政区的旅游文化特色 知识拓展 走马观花澳门博彩业素材 湘教版.doc

    八年级地理下册 第七章 第二节 澳门特别行政区的旅游文化特色 知识拓展 走马观花澳门博彩业素材 湘教版.doc

    Proto3语言指南-简体中文版

    花了一个周末的时间把它走马观花的学习了一下,顺便将官方的指南翻译了出来,这个应该是最新的---其他地方还没发现有! 首先申明,哥们儿英语高中水平,借助了必应词典勉强将其意译了出来,如果你发现翻译中有纰漏,...

    leetcode小岛出水口-LeetCode:LeetCode走马观花

    01.两数之和 02.两数相加 03.无重复字符的最长子串 05.最长回文子串 06.Z字型变换 07.整数反转 08.字符串转换整数 09.回文数 10.正则表达式匹配 11.盛最多水的容器 12.整数转罗马数字 13.罗马数字转整数 14.最长公共...

    Flex从入门到实践——源代码(11章)

    Flex从入门到实践——源代码(11章)

    FX2N工业洗衣机

    注释没有加完,走马观花一番,需要花点时间研究,有兴趣的看看

    智能时代读书心得(2).docx

    智能时代读书心得(2)全文共14页,当前为第1页。智能时代读书心得(2)全文共14页,当前为第1页。智能时代读书心得 智能时代读书心得(2)全文共14页,当前为第1页。 智能时代读书心得(2)全文共14页,当前为第1页。 智能...

    Java 高级特性.doc

    a..使用?通配符可以引用其他各种参数化的类型,但不能调用与参数化有关的方法; Collection&lt;?&gt; c = new Vector(); c.add("abc");//报错 c.size();//正确 所以,?通配符定义的变量主要用作引用,调用与参数化无关...

    Perl语言入门(第五版-中文版).pdf

    《perl语言入门》也就是大家所称道的“小骆驼书”,是perl程序设计人员最为仰赖的启蒙读物之一。自1993年以来,这本书就成为热卖的perl语言教学材料,而此次新版又涵盖了perl 5.10的最新变化。本书的诸位作者自1991...

    Nexys3学习手记3:硬件外设走马观花

    我建议大家不妨先看看原理图,再对照电路板实物,把整个电路简单的消化一下,并且弄清楚板载跳线、电源插座等的具体用法和注意事项,免得上演“高压冒烟”的惨剧。

    mini-rails:仅有600行代码的精简版Rails,可作为学习Rails原始码的向导-代

    但二进制文件太多,核心代码都没没在大量细节实现中,全部看完不现实,走马观花又很难领会精髓;纸上得来终觉浅,眼过千遍,不如手过一遍,干脆重新造个轮子;于是就有了mini-rails,参照Rails原始码,省略细节,...

    四级阅读考前必背200词 .pdf

    首先,预览选项,了解du词义并把选项分为zhi四大类词性——名词n,动词v,形容词a,副词ad。在每个选项后作词性的简要标记; 其次,精读全文开头,把握文章主题,并以三个空或一个段落为一个单位,利用前后文判断每...

    05、JAVA【Android开发】系统功能精讲视频.part2

    05课系统功能部分比较大,做了分包,请下载两个一起解压,第二部分不收费哦! 本教程是本人在学习JAVA【Android开发】时候珍藏的视频,视频讲...不要走马观花,一路快进,编程没有捷径,有时候你一个快进,就错过了重点

    asp专业销售手机商业网站

    (2)阐述整个个性化页面生成系统的系统结构及工作原理;分析了系统实现中的特殊性、难点和重点。 (3)设计实现用户注册/登录、查询、购买;管理员对网站的系统管理;个性化页面动态生成--回显等程序模块;实现ASP...

    HBase最佳实践-用好你的操作系统

    终于又切回HBase模式了,之前一段时间因为工作的原因了解接触了一段时间大数据生态的很多其他组件(诸如Parquet、Carbondata、Hive、SparkSQL、TPC-DS/TPC-H等),虽然只是走马观花,但也受益良多。对视野、思维模式...

    计算机专业实习调研报告.doc

    关于城镇学校计算机多媒体教学现状的调研报告 河南农大信管学院2010级 软件工程2班 袁向铎 学号:1010107056 指导老师:郑光 撰写日期:2011年10月2日 关于城镇学校计算机多媒体教学现状的调研报告 引言: 随着信息...

Global site tag (gtag.js) - Google Analytics