JAVA
6是06年底发布的。2006年啊!!那时候我还没大学毕业呢,小毛孩一个!JAVA是个跨平台的东西,它能屏蔽底层硬件差异而提供一个统一的内存模型,这点十分了不起!换句话说,想用JAVA写出高性能的程序,并不必怎么了解CPU架构,而且,06年的时候,Intel还没有Nehalem呢!!!我最近一直在看那本《The
Art of Multiprocessor
Programming》,今天终于看到SkipList了。然后我在想,如果用SkipList实现一个Map,然后用它来管理cache,该多好啊?结果,结果,发现JAVA
6在发布的时候已经实现了这个了
,ConcurrentSkipListMap,那时5年前了啊!关键是,人家的标准库,真的是该有的都有了,而不是像pthreads那样,除了mutex/condition
variable之外一无所有。不过JDK中满足non-blocking性质的数据结构没几个,我知道就ConcurrentLinkedQueue、ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet这么四个。目前我所看过的所有paper也都集中在链表、hash
map以及skip
list上。我本想用ConcurrentSkipListMap来管理cache,但是ConcurrentSkipListMap有个缺点,它的size方法是O(n)的。这个给做lru带来了麻烦。于是,我不能每次insert的时候都检查一下是否达到capacity上限了。
如果你自认为精通“JAVA”或“数据结构”或“多线程编程”中的任何一个,那么去看看ConcurrentSkipListMap的代码吧,一定会被惊倒的!我觉得我有生之年写不出这么优秀的东西……
嗯,但是我读懂了一个关键点:为数据结构设计并发算法的时候,核心在于找到那个不变的东西!无论数据怎么插怎么删,总有一个性质,始终保持不变!