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

瓜娃之走马观花 (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

    单片机实例-走马观花

    【单片机实例-走马观花】是一个适合初学者的实践项目,旨在通过一个具体的走马灯(或称为流水灯)实验,帮助学习者掌握单片机的基础操作和编程技巧。走马灯通常指的是LED灯按照特定顺序依次点亮或熄灭,形成流动的...

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

    走马观花灯是一种常见的灯光装饰,通过编程和控制能够实现多样的动态效果。这篇实训报告主要探讨了基于单片机实现可调控走马灯的设计与实现过程,旨在提升学生对于单片机应用和硬件电路设计的理解。 首先,报告的...

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

    这份名为"Java程序设计高晓黎走马观花看PPT教案学习.pptx"的学习材料似乎提供了关于Java核心概念的概览,包括程序结构、运行机制、GUI界面、JVM的工作原理和垃圾回收机制。 首先,Java程序的结构框架是理解任何编程...

    五年级上册,语文选择题.pdf

    - "走马观花"中的"观"意为看,选A。 - "古今贯通"中的"贯"意为连贯,选B。 3. 语言运用: - 在句子"你总能从一本书中发现新东西;()你看过多少遍。"中,填入"C 不管"最合适,表示无论看了多少遍都能发现新内容...

    东山事业编招聘2019年考试真题及答案解析完整版(2).docx

    【题目2】 本题考查文学常识。吴承恩是中国明朝小说家,代表作是《西游记》。选项分析如下: A. 干宝是晋代文学家,著有志怪小说集《搜神记》。 B. 罗贯中是元末明初小说家,代表作是历史小说《三国演义》。 C. ...

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

    第2章:MXML与ActionScript MXML是Flex中的标记语言,用于描述用户界面。ActionScript是Flex中的脚本语言,用于处理逻辑和交互。这一章将详细解释两者的差异和联系,如何在MXML中嵌入ActionScript,以及如何通过...

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

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

    Proto3语言指南-简体中文版

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

    FX2N工业洗衣机

    描述中的"注释没有加完,走马观花一番,需要花点时间研究"暗示了FX2N工业洗衣机的控制系统可能包含了一些复杂性和深度,需要对FX2N PLC有深入的理解才能完全掌握。对于初学者或不熟悉的工程师来说,这可能是一个挑战...

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

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

    Linux那些事儿之我是USB(第2版)

    ### Linux那些事儿之我是USB(第2版)关键知识点概览 #### 一、书籍概述 - **核心主题**:本书主要围绕Linux内核中的USB子系统展开,深入剖析其工作原理和技术细节。 - **目标读者**:面向Linux初学者、驱动开发者...

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

    【Nexys3学习手记3:硬件外设走马观花】 在探索Nexys3开发板的硬件世界时,了解其结构和组件至关重要。Nexys3是一款基于Spartan-6 FPGA(XC6SLX16)的教育与实验平台,它拥有丰富的外设,便于学习和实践数字系统...

    小学成语填空大全.doc

    2. **填上人体部位组成成语**:这些成语由人体部位构成,具有生动的形象感,如: - 出人(头)地:形容人的才能或成就超出常人。 - 另(眼)相看:表示用不同的或更高的标准来看待某人。 - 画龙点(睛):比喻在...

    五年级语文下册 第三单元 13 精读与略读教案2 苏教版-苏教版小学五年级下册语文教案.docx

    【五年级语文下册第三单元 13 精读与略读教案2 苏教版】这篇教案针对小学五年级学生,旨在教授他们如何有效掌握两种不同的阅读方法——精读与略读。精读是一种深入细致的阅读方式,注重理解和品味每一个细节,而略读...

    三年级上册成语归类大全.doc

    2. 描写人的智慧的成语: - 料事如神:形容预料事情准确,如同神仙一般。 - 足智多谋:充满智慧,善于策划。 - 融会贯通:把各种知识综合理解,达到透彻领悟。 - 学贯中西:精通中西方的学问。 - 博古通今:...

    小学生课外知识集锦.doc

    - 描写山水美景、花草树木、日月风云的成语,让孩子们感受自然之美,培养审美能力。 这份集锦不仅提供了丰富的词汇,还包含了许多富有哲理的成语故事,帮助小学生在积累知识的同时,提升思维能力和人文素养。

    阅读方法有哪些.docx

    #### 2. 扫瞄或走马观花地阅读 - **定义**:比翻阅更细致一些,但仍保持较快的速度。 - **特点**:能够捕捉书籍中的关键信息和主题。 - **应用场景**: - 需要在短时间内获取大量信息时。 - 检查文章或报告是否...

    2014_2015句子练习——陈晖.ppt

    - 走马观花:形容快速地看,没有仔细欣赏。 - 变化多端:形容变化非常多,难以预测。 - 枝繁叶茂:形容树木枝叶茂密繁盛。 - 无忧无虑:形容没有忧虑和烦恼。 - 粗细各异:形容事物的粗细不一,各有特点。 - ...

Global site tag (gtag.js) - Google Analytics