Java中各种锁类型的基准性能评测
星期二, 八月 10th, 2010
周末对Java中各种类型的锁做了基准评测。测试的条件有两个:1)是10、50、100个不同的并发线程,2)是读写比例近似1:1,10:1,100:1,1000:1。测试方法是,对各种加锁的Map方法做性能评测,它们都是实现了MapWrapper接口的封装,测试的就是Map的get和put方法。测试的锁类型有:1)hashtable:直接测试Hashtable,2)synclock:对HashMap的方法直接加synchronized(理论上性能应和Hashtable相当),3)mutexlock:对HashMap的方法显示加Lock锁,4)rwlock:对HashMap加读写锁,5)concrrent:直接使用ConcurrentHashMap的方法,6)对HashMap读操作不加锁,写操作加Lock。
[Solr源码分析]LRUCache和FastLRUCache实现分析
星期一, 八月 9th, 2010
在 [Solr 实践]Solr Cache使用介绍及分析 一文我有对Solr的LRUCache和FastLRUCache做了一些介绍,本文在此基础对其实现做些补充。
1、LRUCache的实现分析
在分析LRUCache前先对LinkedHashMap做些介绍。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序,这可以由其构造函数public LinkedHashMap(int initialCapacity,float loadFactor, boolean accessOrder)指定。所以,对于get、put、remove等操作,LinkedHashMap除了要做HashMap做的事情,还做些调整Entry顺序链表的工作。
以get操作为例,如果是LRU顺序(accessOrder为true),Entry的recordAccess方法就调整get到的Entry到链表的头部去:
public V get(Object key) {
Entry<K,V> e = (Entry<K,V>)getEntry(key);
if (e [...]
分析多线程并发写HashMap线程被hang住的原因
星期六, 八月 7th, 2010
在blogjava上看到一文 谁能帮忙解释一下为什么这个程序会死锁?,激发了我那能害死猫的好奇,所以很费劲的琢磨了这个问题。由于涉及的内容较多,就单独发文阐述一下。
文中提到的问题程序如下:
public class TestLock {
private final HashMap map = new HashMap();
public TestLock() {
final Thread t1 = new Thread() {
@Override
public void run() {
for(int i=0; i<500000; i++) {
[...]