- 浏览: 153466 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
仔细研究了刚发布1.0版本的Google Collections,被其中的MapMaker震惊,这不就是我梦寐以求的Concurrent Map神器吗?如果Google Collection在5年前就发布该有多好?!废话少讲,邀请大家一起来观赏一下什么是MapMaker。
Hashtable太老土啦,线程安全我都用ConcurrentHashMap。什么?现在流行MapMaker?
JDK 1.5引入的ConcurrentHashMap由于其精巧的设计,更高的并发性能,捕获了大家的心,在并发场景中出场率极高,但随着深入的使用,很快的就发现了其中的不足。例如在以Map作为Cache的典型场景中,我们都需要有元素过期的处理,WeakHashMap是这方面的高手,但其在并发方面有点菜(非线程安全),当我们想让这两位大将同时上场的时候,就只能抓耳搔腮了。
Google Collections中的MapMaker融合了Weak Reference,线程安全,高并发性能,异步超时清理,自定义构建元素等强大功能于一身。(注)
常阅读优秀源代码的童鞋都知道,一般叫Maker的对象都是Builder模式,而这个MapMaker就是来"Build"Map的,下面的代码展示了如何构建一个高并发性能,线程安全的WeakHashMap.
Java代码
public void testWeakKeys() throws Exception {
ConcurrentMap<Key, Value> map = new MapMaker()
.weakKeys() // 指定Map保存的Key为WeakReference机制
.makeMap();
Key key = new Key();
map.put(key, new Value()); // 加入元素
key = null; // key变成了WeakReference
System.gc();// 触发垃圾回收
TimeUnit.SECONDS.sleep(1L);
assertTrue(map.isEmpty()); // map空了,因为WeakReference被回收
}
是不是够简单?他不仅支持WeakKeys,还支持WeakValues。
Java代码
public void testWeakValues() throws Exception {
ConcurrentMap<Key, Value> map = new MapMaker()
.weakValues() // 指定Map保存的Value为WeakReference机制
.makeMap();
Key key = new Key();
Value value = new Value();
map.put(key, value); // 加入元素
key = null; // Key成了WeakReference
System.gc();// 触发垃圾回收
TimeUnit.SECONDS.sleep(1L);
assertFalse(map.isEmpty()); // map里的东西还在,因为Value还是StrongReference
value = null; // 这次value也变成了WeakReference
System.gc(); // 触发垃圾回收
TimeUnit.SECONDS.sleep(1L);
assertTrue(map.isEmpty()); // map真空了,因为Value是WeakReference被回收
}
还可以选用SoftKeys,和SoftValues,随意组合,比只能WeakKey的WeakHashMap扩展性强太多了。
再来看看On-demand value computation,自定义构建元素。想象下面的场景,你要为一个查询学生信息的DAO增加结果缓存,并且结果超过60秒过期,我们可以用装饰模式结合MapMaker简单的实现。
Java代码
interface StudentDao {
Information query(String name);
}
class StudentDaoImpl implements StudentDao {
// 真正去查数据库的实现类 代码省略
}
// 装饰器
class CachedStudentDao implements StudentDao {
private final StudentDao studentDao;
private final ConcurrentMap<String, Information> cache;
public CachedStudentDao(final StudentDao studentDao) {
Preconditions.checkNotNull(studentDao, "studentDao");
this.studentDao = studentDao;
this.cache = new MapMaker() // 构建一个 computingMap
.expiration(60, TimeUnit.SECONDS) // 元素60秒过期
.makeComputingMap(new Function<String, Information>(){
@Override
public Information apply(String name) {
return studentDao.query(name);
}
});
// 传入匿名Function自定义缓存的初始化。如果缓存中没有name对应的数据,则调用真正的dao去数据库查找数据,同时缓存结果。
}
@Override
public Information query(String name) {
return cache.get(name); // 从computing cache中取结果
}
}
public void test() {
StudentDao cachedStudentDao = new CachedStudentDao(studentDaoImpl);
// 装饰了studenDaoImpl的cachedStudentDao具备了缓存结果的能力。
}
线程安全,高并发性能,元素过期都实现了,并且代码很简洁。多亏了MapMaker,脏活、累活,就交给它啦。不过要注意的是,要遵循ConcurrentHashMap的规范,其不允许有Null的Key和Value。如果查询出来的结果可能为Null的,可用简单的包装类包装一下,这里不给出代码了。
Hashtable太老土啦,线程安全我都用ConcurrentHashMap。什么?现在流行MapMaker?
JDK 1.5引入的ConcurrentHashMap由于其精巧的设计,更高的并发性能,捕获了大家的心,在并发场景中出场率极高,但随着深入的使用,很快的就发现了其中的不足。例如在以Map作为Cache的典型场景中,我们都需要有元素过期的处理,WeakHashMap是这方面的高手,但其在并发方面有点菜(非线程安全),当我们想让这两位大将同时上场的时候,就只能抓耳搔腮了。
Google Collections中的MapMaker融合了Weak Reference,线程安全,高并发性能,异步超时清理,自定义构建元素等强大功能于一身。(注)
常阅读优秀源代码的童鞋都知道,一般叫Maker的对象都是Builder模式,而这个MapMaker就是来"Build"Map的,下面的代码展示了如何构建一个高并发性能,线程安全的WeakHashMap.
Java代码
public void testWeakKeys() throws Exception {
ConcurrentMap<Key, Value> map = new MapMaker()
.weakKeys() // 指定Map保存的Key为WeakReference机制
.makeMap();
Key key = new Key();
map.put(key, new Value()); // 加入元素
key = null; // key变成了WeakReference
System.gc();// 触发垃圾回收
TimeUnit.SECONDS.sleep(1L);
assertTrue(map.isEmpty()); // map空了,因为WeakReference被回收
}
是不是够简单?他不仅支持WeakKeys,还支持WeakValues。
Java代码
public void testWeakValues() throws Exception {
ConcurrentMap<Key, Value> map = new MapMaker()
.weakValues() // 指定Map保存的Value为WeakReference机制
.makeMap();
Key key = new Key();
Value value = new Value();
map.put(key, value); // 加入元素
key = null; // Key成了WeakReference
System.gc();// 触发垃圾回收
TimeUnit.SECONDS.sleep(1L);
assertFalse(map.isEmpty()); // map里的东西还在,因为Value还是StrongReference
value = null; // 这次value也变成了WeakReference
System.gc(); // 触发垃圾回收
TimeUnit.SECONDS.sleep(1L);
assertTrue(map.isEmpty()); // map真空了,因为Value是WeakReference被回收
}
还可以选用SoftKeys,和SoftValues,随意组合,比只能WeakKey的WeakHashMap扩展性强太多了。
再来看看On-demand value computation,自定义构建元素。想象下面的场景,你要为一个查询学生信息的DAO增加结果缓存,并且结果超过60秒过期,我们可以用装饰模式结合MapMaker简单的实现。
Java代码
interface StudentDao {
Information query(String name);
}
class StudentDaoImpl implements StudentDao {
// 真正去查数据库的实现类 代码省略
}
// 装饰器
class CachedStudentDao implements StudentDao {
private final StudentDao studentDao;
private final ConcurrentMap<String, Information> cache;
public CachedStudentDao(final StudentDao studentDao) {
Preconditions.checkNotNull(studentDao, "studentDao");
this.studentDao = studentDao;
this.cache = new MapMaker() // 构建一个 computingMap
.expiration(60, TimeUnit.SECONDS) // 元素60秒过期
.makeComputingMap(new Function<String, Information>(){
@Override
public Information apply(String name) {
return studentDao.query(name);
}
});
// 传入匿名Function自定义缓存的初始化。如果缓存中没有name对应的数据,则调用真正的dao去数据库查找数据,同时缓存结果。
}
@Override
public Information query(String name) {
return cache.get(name); // 从computing cache中取结果
}
}
public void test() {
StudentDao cachedStudentDao = new CachedStudentDao(studentDaoImpl);
// 装饰了studenDaoImpl的cachedStudentDao具备了缓存结果的能力。
}
线程安全,高并发性能,元素过期都实现了,并且代码很简洁。多亏了MapMaker,脏活、累活,就交给它啦。不过要注意的是,要遵循ConcurrentHashMap的规范,其不允许有Null的Key和Value。如果查询出来的结果可能为Null的,可用简单的包装类包装一下,这里不给出代码了。
发表评论
-
java 栈内存解惑
2013-10-23 23:41 673int j = 0; j = j++; ... -
Google Guava Collections 使用介绍
2013-07-16 18:10 709Google Guava Collections 使用介绍 J ... -
java wait 研究
2013-06-28 17:07 779[color=red]java wait 的使用必须放在实例对 ... -
java钩子函数的使用已经kill
2013-06-27 22:31 1555package com.aircoder.test; imp ... -
java获取所有的线程信息
2013-06-24 20:02 1599public class T2 { public sta ... -
java 获取mysql datetime 时间注意
2013-05-16 14:43 1522class SPubinfo implements RowMa ... -
java wait的解锁理解********
2013-04-18 10:49 944很多书都说wait会释放线程加的锁,其实经过试验不是这样的, ... -
jvm 关闭处理注册方法
2013-04-08 16:11 759import java.lang.*; public cla ... -
wget ftp 下载文件java代码
2013-04-05 15:16 1156private boolean wget(String fil ... -
xPath 解析xml
2013-04-05 15:14 735使用xPath 根据路径解析文件. xpath 具有多个版本。 ... -
java callable疑惑:
2013-04-05 15:12 581看了 线程持的源码和Futuretask的源码终于明白了 Fu ... -
ubuntu eclipse 问题
2013-04-05 03:30 791Eclipse 3.6 在 Ubuntu 10.04 下会出现 ... -
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
2013-03-27 16:47 2545LockSupport.park(); 停止 Sy ... -
ehchahe 例子
2013-01-23 15:40 1009package test; import net.sf.eh ... -
java 类加载
2012-12-24 15:21 7551: 访问一个类的静态方法的时候。不会引起一个类的初始化,即类 ... -
java 获取图片高和宽
2012-12-13 17:01 1397public static Map<String,Int ... -
java建立socket,返回浏览器的请求
2012-12-01 01:58 1017package com.jdk.api.test; impo ... -
schedulePool.scheduleAtFixedRate 是个误解
2012-11-22 20:34 1237我们经常使用的java定时器单线程执行,例如: 一个任务每个 ... -
ExecutorCompletionService
2012-11-19 22:36 713package com.jdk.api; import ja ...
相关推荐
Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名的“20%”时间开发而成,并得到了 Java Collections ...
### Google Guava Collections 使用介绍 #### 一、Google Guava Collections 概览 Google Guava Collections,简称Guava Collections,是对Java Collections Framework进行增强和扩展的开源项目。它由Google工程师...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
guava类似Apache Commons工具集包含了若干被Google的 Java项目广泛依赖 的核心库
总结来说,Guava-19.0的这两个jar文件以及对应的sources.jar,为Java开发者提供了强大的工具集,不仅可以在常规Java项目中使用,也能很好地适应GWT的开发需求。源码的提供使得学习和定制变得更加容易,是Java开发中...
通过阅读"Getting Started with Google Guava"、"JavaCachingwithGuava"、"Guava_for_Netflix_"和"guava-concurrent-slides"等文档,你可以深入理解Guava的各种特性和使用场景,从而在实际开发中更好地利用Guava提升...
Guava is a set of core Java libraries from Google that includes new collection types (such as multimap and multiset), immutable collections, a graph library, and utilities for concurrency, I/O, ...
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] ...
Google的Guava是Java开发中一个非常强大的工具库,它由Google工程师开发并维护,提供了一套丰富的Java实用工具集合。Guava的目的是为了简化Java编程,减少代码冗余和提升代码质量。Guava中包含的工具种类繁多,涵盖...
Google Guava是一个比较有趣的框架,它提供了很多有趣的的功能, google Guava 给开发者提供了如下常用功能: 集合(collections) 缓存(caching) 原生的类型支持(primitives support) 并发类库(concurrency ...
1. **集合框架增强**:Guava 提供了丰富的集合类,如 Multiset(多集合)、Multimap(多映射)、Immutable collections(不可变集合)等,这些集合在功能和性能上都优于 Java 标准库中的集合。 2. **缓存**:Guava ...
在版本 30.1.1 中,Guava 继续提供了一系列强大且实用的类,帮助开发者更高效地编写 Java 代码。本文将详细介绍其中的一些重要类,并通过实践代码来展示它们的用法。 1. **Immutable Collections** - `...
扩展组件包括guava-annotations、guava-base、guava-bootstrap、guava-collections、guava-concurrent、guava-gwt、guava-io、guava-parent、guava-primitives、listenablefuture、guava-testlib等。
的情况,这正是Google Collections库提供的一个强大功能。 `Maps`是Google Collections中的一个关键模块,它提供了许多高级的映射操作,比如创建不可变映射、构建双向映射、过滤映射以及并行流处理等。下面我们将...
Guava是Google开发的一个Java库,它包含许多Google核心库中的高级集合、缓存、原生类型支持、并发包、字符串处理、I/O等工具类。版本33.0.0是Guava的一个更新,提供了最新的功能改进和错误修复。在深入探讨Guava常用...
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...
google-collections-1.0-rc2.jar 的jar包,放心使用。
Guava是Google为Java平台设计的一个开源库,它极大地扩展了Java的标准库,尤其是在集合、缓存、并发和I/O等方面。Guava的核心特性包括: 1. **集合框架增强**:Guava提供了丰富的集合类,如Multiset(多集)、...
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] ...
Write more robust code that is easier to read and maintain, Learn how to use Preconditions to prevent and find errors faster, Shows how Guava Collections can make working with Java Collections a ...